c# - 组合框将 itemsource 绑定(bind)到自定义列表并将 selecteditem 绑定(bind)到该列表的实例不起作用

标签 c# wpf data-binding combobox selecteditem

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

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

<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
}

问题是当我在 ListView 中选择一个项目时,组合框仍然是空的。 itemsource 没问题(如果我点击组合框,我可以看到“1 级”和“2 级”)。 我认为缺少一些东西来告诉“Person.GradeGrades 列表的一部分”,但我找不到什么。

希望你能帮助我;)

最佳答案

SelectedItem 在内存中的引用是否与 ItemsSource 中的项目完全相同?

默认情况下,WPF 将通过引用将 SelectedItemItemsSource 中的项目进行比较,如果它们在内存中的引用不同,则返回 no匹配项。

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

  • SelectedValue 绑定(bind)到值类型而不是引用类型,并设置 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); 
    }
    

关于c# - 组合框将 itemsource 绑定(bind)到自定义列表并将 selecteditem 绑定(bind)到该列表的实例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20645968/

相关文章:

c# - 什么是数据表或自定义对象,效率更高?

c# - 想要操作列表中的下一个 Stack<T>

generics - 如何将d:DesignInstance设置为通用类型?

c# - 不同泛型类型的集合

c# - 如何使用 MVVM 在 WPF 应用程序中的 InvokeCommandAction 中将多个参数作为 CommandParameter 传递

c# - .NET 中是否存在弱引用?

使用真假值的 Angular 单选按钮绑定(bind)

c# - 在 Winforms C# 中调试数据绑定(bind)?

c# - MVVM + Reactive + WCF 回调

c# - 资源文件修改日期