我有查看模型类A并且它具有属性“a”。
我有一个名为B的课程,并且我将所有A []的列表存储为列表,并且它是“b”。
如果属性a有任何变化,我想更改父类A中的属性。
即
B级 {
属性b1;
列出A []
}
A类 {
属性a1;
}
我正在使用MVVM并通知属性chnaged事件在两个地方都存在。什么我不知道如何连接两者。
答案 0 :(得分:0)
在BaseCollection
扩展ObservableCollection<T>
的{{1}}类中,我创建了一个CollectionItemPropertyChanged
delegate
我可以附加处理程序,因此我可以在属性值时收到通知已更改集合中的任何项:
public delegate void ItemPropertyChanged(T item, string propertyName);
然后我添加了delegate
的类型的getter和setter:
public virtual ItemPropertyChanged CurrentItemPropertyChanged { get; set; }
为实现这一目标,我必须为每个项目的PropertyChanged
事件附加一个处理程序:
public BaseCollection(IEnumerable<T> collection)
{
foreach (T item in collection) Add(item);
}
public new void Add(T item)
{
item.PropertyChanged += Item_PropertyChanged;
base.Add(item);
}
我还需要删除对象时删除处理程序:
public new bool Remove(T item)
{
if (item == null) return false;
item.PropertyChanged -= Item_PropertyChanged;
return base.Remove(item);
}
然后是Item_PropertyChanged
处理程序:
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (CollectionItemPropertyChanged != null) CollectionItemPropertyChanged(
currentItem, e.PropertyName);
}
然后可以在您的班级B
中使用它,如下所示:
public List<A> Items
{
get { return items; }
set
{
items = value;
items.CollectionItemPropertyChanged += YourHandler;
NotifyPropertyChanged(Items);
}
}
然后你的处理程序:
private void YourHandler(A item, string propertyName)
{
// propertyName is the name of the changed property from the A object named item
}
要更直接地回答您的问题,您可以将处理程序从一个视图模型附加到另一个视图模型中的delegate
...例如:
Items.CollectionItemPropertyChanged += ViewModel2.YourHandler;
或者从其他视图模型:
ViewModel1.Items.CollectionItemPropertyChanged += YourHandler;
答案 1 :(得分:-1)
将View Model A创建为Singleton并使用该实例更新a属性。