0

我希望标题是可以理解的,但无论如何我会尽力描述这个问题。我有一个 ObservableCollection GroupList,其中包含 Group 类型的对象。类 Group 非常简单:

public class Group
{
    public Group()
    {
        Members = new ObservableCollection<Member>();
    }

    public Group(string name)
    {
        Members = new ObservableCollection<Member>();
        GroupName = name;
    }
    public ObservableCollection<Member> Members { get; set; }
    public string GroupName { get; set; }
}

GroupList 是我在视图中拥有的 ComboBox 的 ItemsSource,它决定了要在 ListBox 中显示哪些 ObservableCollection 成员。然后将 ListBox 中 SelectedItem 的属性绑定到一些 TextBox 以显示每个成员的名称、年龄等。

我的问题是我有一个名称=“所有成员”的组和其他成员也存在的组。组 A 包含成员 A+B,组 B 包含成员 B+C,但组所有成员包含 A+B+C。但是,如果我更改 Group A 中说 Member A 的属性,它不会反映在 Group All 成员中。我花了几天时间试图找出问题所在,因为如果我在一个新项目中测试它(注销内存),它就像一个魅力:

ObservableCollection<Member> MembersA = new ObservableCollection<Member>;
ObservableCollection<Member> MembersA = new ObservableCollection<Member>;
Member newMember = new Member("TestMember",1986);
MembersA.Add(newMember);
MembersB.Add(newMember);
MembersA.First().Name="TestMemberChanged";

这会更新两个 OC 中的成员,但不会更新我的项目中的成员,我不知道出了什么问题。我是否还需要为成员和组实现像 INotifyPropertyChanged 这样的接口?(它已经在 VM 中为 GroupList 实现了)。还是我需要手动更新 OnPropertyChanged 或 CollectionChanged 事件中的所有 OC?

private ObservableCollection<Group> _groupList;
    public ObservableCollection<Group> GroupList
    {
        get
        {
            return _groupList;
        }
        set
        {
            _groupList = value;
            Notify("GroupList");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void Notify(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

我意识到我的架构可能效率低下,因此非常欢迎提出任何改进它的建议。

4

1 回答 1

0

是的,您已经说过答案:您还需要为 Member 类实现 INotifyPropertyChanged,并在诸如“Name”之类的 Member 属性更改其值时引发该事件。这是因为 ObservableCollection 仅在从列表中添加/删除/重新排序项目时通知用户界面,而不是在列表中一项的属性值发生更改时通知用户界面。

于 2012-06-23T09:29:39.303 回答