我有两个实现INotifyPropertyChanged的类,它们分别按预期工作。但是,我在一个类(ClassA)中添加了一个属性(Status),该属性根据另一个类(ClassB)中的值提供了一个值,并且当ClassB中的成员发生更改时,我没有在ClassA中获得更新
基本上,ClassA具有一个保存ClassB列表的属性,我的想法是,当ClassB中的一个成员发生更改时,它将反映并更新ClassA中Status的绑定。
这是一个例子...
public class ClassA : BaseModel
{
private ConnectionStatus _status;
public ConnectionStatus Status
{
get
{
ConnectionStatus status = ConnectionStatus.Disconnected;
foreach (ClassB classB in ClassBs)
{
status = classB.Status;
if (status != ConnectionStatus.Connected)
{
break;
}
}
return status;
}
}
private ObservableCollection<ClassB> _classBs;
public ObservableCollection<ClassB> ClassBs
{
get { return _classBs; }
set
{
_classBs = value;
OnPropertyChanged();
OnPropertyChanged("Status");
}
}
}
public class ClassB : BaseModel
{
private ConnectionStatus _status;
public ConnectionStatus Status
{
get { return _status; }
set
{
_status = value;
OnPropertyChanged();
}
}
}
XAML:
<TextBlock Text="{Binding Path=ClassAObject.Status}" />
Status属性在被调用时将反映正确的值,但是我在XAML中具有的绑定没有改变。
DataContext和Binding的设置正确,如果我手动更新Status,它将更新,而不是在ClassBs中的成员更新时更新。
答案 0 :(得分:1)
Observable集合已经实现了INotifyPropertyChanged,因此您不需要在属性ClassB中调用OnPropertyChanged
[System.Serializable]
public class ObservableCollection<T> : System.Collections.ObjectModel.Collection<T>, System.Collections.Specialized.INotifyCollectionChanged, System.ComponentModel.INotifyPropertyChanged
当类B中的status属性更改时,您不会收到通知的主要原因是因为类A中称为类B的属性是类B类型的对象的集合,并且对象本身不会更改,仅更改其中一个的属性元素,但集合是相同的。因此,引发通知的唯一方法是在集合中添加或删除和项。
private ObservableCollection<ClassB> _classBs;
public ObservableCollection<ClassB> ClassBs
{
get { return _classBs; }
set
{
_classBs = value;
OnPropertyChanged();
OnPropertyChanged("Status");
}
}
我建议您在ClassB内部创建一个EventHandler并从ClassA订阅