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