如何捕获甚至在另一个视图模型中的一个视图模型中更改的属性

时间:2013-09-05 11:47:02

标签: wpf mvvm notify

我有查看模型类A并且它具有属性“a”。

我有一个名为B的课程,并且我将所有A []的列表存储为列表,并且它是“b”。

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

B级 {

属性b1;

列出A []

}

A类 {

属性a1;

}

我正在使用MVVM并通知属性chnaged事件在两个地方都存在。什么我不知道如何连接两者。

2 个答案:

答案 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属性。