Combobox将itemsource绑定到自定义列表,将selecteditem绑定到该列表的实例不起作用

ant*_*B29 4 c# data-binding wpf combobox selecteditem

我尝试了不同的方法让我的组合框工作,但我仍然卡住了:(

这是我的应用程序的一个非常简化的版本:(刚编辑,抱歉错误)

<ListView ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson}"/>
<ComboBox ItemsSource="{Binding Grades}" SelectedItem="{Binding SelectedPerson.MyGrade}" 
     DisplayMemberPath="Name"/>
Run Code Online (Sandbox Code Playgroud)

而背后的代码:

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
}
Run Code Online (Sandbox Code Playgroud)

问题是当我在列表视图中选择一个项目时,组合框仍然是空的.itemsource是好的(如果我点击组合框,我可以看到"1级"和"2级").我认为缺少一些东西要告诉"这Person.Grade是Grades列表的一部分",但我找不到什么.

希望你能帮我 ;)

Rac*_*hel 6

SelectedItem内存中的参考与该项中的完全相同ItemsSource吗?

默认情况下,WPF会将其与引用中SelectedItem的项进行比较ItemsSource,如果它们在内存中不是相同的引用,则它将不返回任何匹配项.

如果您无法在代码中执行此操作,则最常见的解决方法是:

  • 绑定SelectedValue到值类型而不是引用类型,并设置SelectedValuePath

    <ComboBox ItemsSource="{Binding Grades}" 
              SelectedValue="{Binding SelectedPerson.MyGrade.GradeId}" 
              SelectedValuePath="GradeId"
              DisplayMemberPath="Name"/>
    
    Run Code Online (Sandbox Code Playgroud)
  • 或者覆盖.Equals()以确保在特定属性匹配时将两个对象视为相等,而不是在内存中的引用匹配时被视为相等.

    public override bool Equals(object obj) 
    { 
        if (obj == null || !(obj is Grade)) 
            return false; 
    
        return ((Grade)obj).GradeId == this.GradeId); 
    }
    
    Run Code Online (Sandbox Code Playgroud)