我有视图模型类 A,它具有属性“a”。
我有一个名为 B 的类,它有属性“b”,我将所有 A[] 的列表存储为列表。
如果属性 a 有任何更改,我想更改父类 A 中的属性。
那是
B类{
属性 b1;
列表 A[]
}
A类{
财产a1;
}
我正在使用 MVVM 并通知属性更改事件在这两个地方都存在。我不知道如何将两者连接起来。
在我BaseCollection
的 extends 类中ObservableCollection<T>
,我创建了一个可以附加处理程序的 a,因此当集合中任何项目的CollectionItemPropertyChanged
delegate
属性值发生更改时,我可以收到通知:
public delegate void ItemPropertyChanged(T item, string propertyName);
然后我添加了以下类型的getter和setter delegate
:
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;
将 View Model A 创建为 Singleton 并使用该实例更新 a 属性。