0

我有视图模型类 A,它具有属性“a”。

我有一个名为 B 的类,它有属性“b”,我将所有 A[] 的列表存储为列表。

如果属性 a 有任何更改,我想更改父类 A 中的属性。

那是

B类{

属性 b1;

列表 A[]

}

A类{

财产a1;

}

我正在使用 MVVM 并通知属性更改事件在这两个地方都存在。我不知道如何将两者连接起来。

4

2 回答 2

0

在我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;
于 2013-09-05T12:06:09.300 回答
-1

将 View Model A 创建为 Singleton 并使用该实例更新 a 属性。

于 2017-03-01T09:16:04.777 回答