【发布时间】:2014-01-05 21:54:05
【问题描述】:
我尝试了很多不同的方法来让我的组合框工作,但我仍然卡住了:(
这是我的应用程序的一个非常简化的版本:(刚刚编辑,有错误请见谅)
<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 列表的一部分”,但我找不到什么。
希望你能帮助我;)
【问题讨论】:
-
SelectedItem在内存中的引用是否与ItemsSource中的项目完全相同?默认情况下,WPF 将通过引用比较项目,所以这可能是您的问题。如果它们不同,我建议使用SelectedValue或可能覆盖.Equals()。有关示例,请参见 here :) -
我认为问题来自类似的东西,我不认为 selecteditem 和 itemssource 来自相同的参考。我今晚会测试一下,让你知道;)
-
真的非常感谢!! equals 覆盖方法救了我 :) :)
-
很高兴为您解决问题 :) 我将其发布为下面的答案,以防其他人正在寻求解决同样的问题
标签: c# wpf data-binding combobox selecteditem