我尝试了非常不同的方法来使我的组合框正常工作,但我仍然陷入困境:(
这是我的应用程序的一个非常简化的版本:(刚刚编辑,抱歉错误)
<ListView ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson}"/>
<ComboBox ItemsSource="{Binding Grades}" SelectedItem="{Binding SelectedPerson.MyGrade}"
DisplayMemberPath="Name"/>
以及背后的代码:
public class Person
{
private string name;
public string Name
{
get { return name; }
set
{
if (name != value)
{
name = value;
NotifyPropertyChanged("Name");
}
}
}
private Grade myGrade;
public Grade MyGrade
{
get { return myGrade; }
set
{
if (myGrade != value)
{
myGrade = value;
NotifyPropertyChanged("MyGrade");
}
}
}
//-- INotifyPropertyChanged implementation
}
public class Grade
{
private string name;
public string Name
{
get { return name; }
set
{
if (name != value)
{
name = value;
NotifyPropertyChanged("Name");
}
}
}
private int prop;
public int Prop
{
get { return prop; }
set
{
if (prop != value)
{
prop = value;
NotifyPropertyChanged("Prop");
}
}
}
//-- INotifyPropertyChanged implementation
}
public partial class MainWindow : Window
{
public ObservableCollection<Person> People { get; set; }
public ObservableCollection<Grade> Grades { get; set; }
private Person selectedPerson;
public Person SelectedPerson
{
get { return selectedPerson; }
set
{
if (selectedPerson != value)
{
selectedPerson = value;
NotifyPropertyChanged("SelectedPerson");
}
}
}
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
People = new ObservableCollection<Person>();
Grades = new ObservableCollection<Grade>();
Grades.Add(new Grade() { Name = "Grade 1", Prop = 1 });
Grades.Add(new Grade() { Name = "Grade 2", Prop = 2 });
People.Add(new Person() { Name = "guy 1", MyGrade = Grades[0] });
People.Add(new Person() { Name = "guy 2", MyGrade = Grades[0] });
People.Add(new Person() { Name = "guy 3", MyGrade = Grades[1] });
}
//-- INotifyPropertyChanged implementation
}
问题是当我在列表视图中选择一个项目时,组合框仍然为空。
itemsource 没问题(如果我单击组合框,我可以看到“grade 1”和“grade 2”)。
我认为缺少一些东西来告诉“Person.Grade
是的一部分Grades
列表”,但我找不到什么。
希望你能帮我 ;)
Is the SelectedItem
内存中的引用与中的项目完全相同ItemsSource
?
默认情况下,WPF 将比较SelectedItem
到中的项目ItemsSource
通过引用,如果它们在内存中不是相同的引用,它将返回不匹配的项目。
如果您无法在代码中执行此操作,最常见的解决方法是:
-
绑定SelectedValue
为值类型而不是引用类型,并设置SelectedValuePath
<ComboBox ItemsSource="{Binding Grades}"
SelectedValue="{Binding SelectedPerson.MyGrade.GradeId}"
SelectedValuePath="GradeId"
DisplayMemberPath="Name"/>
-
或者覆盖.Equals()
确保当特定属性匹配时两个对象被视为相等,而不是当内存中的引用匹配时被视为相等。
public override bool Equals(object obj)
{
if (obj == null || !(obj is Grade))
return false;
return ((Grade)obj).GradeId == this.GradeId);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)