C# 组合框双向绑定不起作用

C# 组合框双向绑定不起作用,c#,wpf,xaml,combobox,C#,Wpf,Xaml,Combobox,我总是被这些组合框压得喘不过气来。我想我理解他们,但似乎我不理解 我不想给一个对象一个父对象。我得到了这个子对象,它有一个值,它是父对象的ID,我有一个父项集合 我从组合框中选择父对象,如果我理解正确,它的ID属性应该绑定到子对象的ParentId属性。它似乎很好,当我选择它时,属性就消失了。模板已更改,并显示为文本块,一切正常。当模板返回到组合框类型时,它突然变为Null。它不应该在集合中找到Id与ParentId对应的可比较项吗 代码如下: 母公司 public class Parent {

我总是被这些组合框压得喘不过气来。我想我理解他们,但似乎我不理解

我不想给一个对象一个父对象。我得到了这个子对象,它有一个值,它是父对象的ID,我有一个父项集合

我从组合框中选择父对象,如果我理解正确,它的ID属性应该绑定到子对象的ParentId属性。它似乎很好,当我选择它时,属性就消失了。模板已更改,并显示为文本块,一切正常。当模板返回到组合框类型时,它突然变为Null。它不应该在集合中找到Id与ParentId对应的可比较项吗

代码如下:

母公司

public class Parent
{
    private string _id;
    public string Id
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
            OnPropertyChanged("Id");
        }
    }

    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }
}
孩子

XAML组合框

<ComboBox DisplayMemberPath="Name" SelectedValue="{Binding Path=ParentId, Mode=TwoWay}" 
SelectedValuePath="Id" ItemsSource="{Binding Path=ParentCollection}" />

我不确定你的完整设置是什么样的,我也不知道你的代码到底出了什么问题,但我尝试对一些类似的东西进行建模,这些东西有一个共同的用途,我制作了一个ListView,它绑定到一组有姓名和职业的员工。组合框用于更改所选员工的职业,其XAML如下所示:

    <ComboBox ItemsSource="{Binding Occupations}"
              SelectedValue="{Binding ElementName=lv,Path=SelectedItem.Occupation}"
              SelectedValuePath="{Binding Occupation.Title}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Title}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

我不确定你的完整设置是什么样的,我也不知道你的代码到底出了什么问题,但我尝试对一些类似的东西进行建模,这些东西有一个共同的用途,我制作了一个ListView,它绑定到一组有姓名和职业的员工。组合框用于更改所选员工的职业,其XAML如下所示:

    <ComboBox ItemsSource="{Binding Occupations}"
              SelectedValue="{Binding ElementName=lv,Path=SelectedItem.Occupation}"
              SelectedValuePath="{Binding Occupation.Title}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Title}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

这是WPF中的一个错误,称为级联组合框问题。如果您仔细注意,当itemssource发生更改时,很不幸,组合框将SelectedIndex设置为-1,这会导致SelectedValue清除并松开其绑定。@Akash是这样吗?这是在.NET4中修复的吗。我不相信在我的例子中ItemsSource已经改变了。它在.NET4中还没有修复。当ItemsSource更改时,ComboBox的绑定出现问题,ItemsSource绑定到集合,并且如果添加或删除任何项,ComboBox会尝试更新SelectedValue,但是如果很可能找不到SelectedValue,它会将SelectedIndex设置为-1,并会释放其绑定。这似乎不是我的问题。绑定仍然存在,itemsSource没有更改。我试图重现我的问题,当我将其更新到NET4.0时,问题并没有消失。我猜这是一个不相关的问题。这是WPF中的一个错误,称为级联组合框问题。如果您仔细注意,当itemssource更改时,很不幸,组合框将SelectedIndex设置为-1,这会导致SelectedValue清除并松开其绑定。@Akash是这样吗?这是在.NET4中修复的吗。我不相信在我的例子中ItemsSource已经改变了。它在.NET4中还没有修复。当ItemsSource更改时,ComboBox的绑定出现问题,ItemsSource绑定到集合,并且如果添加或删除任何项,ComboBox会尝试更新SelectedValue,但是如果很可能找不到SelectedValue,它会将SelectedIndex设置为-1,并会释放其绑定。这似乎不是我的问题。绑定仍然存在,itemsSource没有更改。我试图重现我的问题,当我将其更新到NET4.0时,问题并没有消失。我猜这是一个无关的问题。SelectedValuePath不是您在绑定中使用的itemSource中的部分吗?并选择要绑定的对象部分的值?我必须承认我看不出你的SelectedValuePath绑定到什么。那是一种财产吗?如果它是员工的财产,为什么不把elementName也放在那里呢。您的集合项目来源是字符串集合还是职业对象集合?它是员工集合,其属性名称为:string and occulation,职业是一个仅由Title属性组成的对象,如代码中所示。我建议您尝试将SelectedValue路径绑定到集合item类或其子属性之一中的属性,就像我所做的那样。SelectedValue路径不是绑定中使用的itemSource中的部分吗?并选择要绑定的对象部分的值?我必须承认我看不出你的SelectedValuePath绑定到什么。那是一种财产吗?如果它是员工的财产,为什么不把elementName也放在那里呢。您的集合项目来源是字符串集合还是职业对象集合?它是员工集合,其属性名称为:string and occulation,职业是一个仅由Title属性组成的对象,如代码中所示。我建议您尝试将SelectedValue路径绑定到collection item类内的属性或其子属性之一,就像我绑定occulation.Title一样。
public class Employee : INotifyPropertyChanged
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; 
        NotifyPropertyChanged("Name");}
    }

    private Occupation occupation;
    public Occupation Occupation
    {
        get { return occupation; }
        set { occupation = value; 
        NotifyPropertyChanged("Occupation");}
    }

    public Employee(string name, Occupation occupation)
    {
        this.name = name;
        this.occupation = occupation;
    }

    #region INotifyPropertyChanged Members
    ...
    #endregion
}

public class Occupation : INotifyPropertyChanged
{
    private string title;
    public string Title
    {
        get { return title; }
        set { title = value; 
        NotifyPropertyChanged("Title");}
    }

    public Occupation(string title)
    { Title = title; }

    #region INotifyPropertyChanged Members
    ...
    #endregion
}