如何将WPF UserControl挂钩到绑定的ViewModel对象的事件?

时间:2012-07-19 15:45:52

标签: c# wpf mvvm

假设我有UserControlDependencyProperty绑定到ObservableCollection<Foo>对象。 Foo对象的集合实际上被发送到某个Flash ActiveX对象。因此,我不能“WPF绑定”Foo对象的属性。

当Foo对象的属性由UserControl以外的其他内容更新时,我希望通知UserControl以便刷新(即将所有Foo对象重新发送到Flash对象)。

我不太清楚如何处理这个问题。我可以想到两个不那么明显的可能性:

  1. UserControl订阅包含ObservableCollection<Foo>对象的对象的某个事件。每当更改Foo对象的属性时,事件都会触发,因此UserControl会知道重新发送Flash对象的Foo对象。

  2. 让UserControl订阅ObservableCOllection对象的CollectionChanged事件,以某种方式导致ObservableCOllection<Foo>对象使用Action NotifyCollectionChangedAction.Reset引发事件。

    void OnFooCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (!_flashIsLoaded)
            return;
    
        if (e.Action == NotifyCollectionChangedAction.Reset) {
            ClearAndSendFoos(this, Foos);
            return;
        }
        ....
    
  3. 我知道如何才能完成以上两个中的任何一个,或者我怎么能让UserControl知道是时候刷新这个集合了?

2 个答案:

答案 0 :(得分:0)

这里似乎有些不对劲。你用MVVM标记了帖子,所以我想你正在使用它。

使用Model,View,ViewModel,您应该在ViewModel和Model之间进行此项工作。所以ViewModel会订阅模型的事件和更新。如果Model没有这样的事件,那么继承它并添加它。然后因为ViewModel实现了INotifyPropertyChanged并且因为它使用了ObservableCollection,所以View已经更新。

获取ViewModel的ObservableCollection以进行更改,您不必让UserControl订阅任何事件。

视图应该只显示ViewModel更新。

答案 1 :(得分:0)

您应该考虑使用多个ViewModel。

如果您对您所拥有的项目中发生的更改感兴趣 您的ViewModel,为这些项创建一个ViewModel并更改 ViewModel集合为ObservableCollection<ItemViewModel>

这样,您就可以绑定到您真正感兴趣的属性。

我们举个例子:

// the overall viewModel:
public class OverallViewModel : ViewModelBase
{
    public ObservableCollection<ProductViewModel> Products { get; set; };
}

// the item viewmodel:
public class ProductViewModel : ViewModelBase
{
    public string ProductName { get; set; }
    public int CountOfSold { get; set; }
}

所以,你卖5个香蕉。香蕉的数量已售出变化。 由于您直接绑定到该项目,因此不再有任何项目 需要有一个额外的事件,视图(在你的情况下是usercontrol) 可以更新,无需听取人工收集 事件。

我对Flash知之甚少,但也许有一个转换器 托管闪存的usercontrol可以提供帮助。至少你这样做 不必抓取所有列表,只需抓取一个项目。

希望这有助于你