0

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

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

我不太确定如何处理这个问题。我可以想到两种不太明显的可能性:

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

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

    void OnFooCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (!_flashIsLoaded)
            return;
    
        if (e.Action == NotifyCollectionChangedAction.Reset) {
            ClearAndSendFoos(this, Foos);
            return;
        }
        ....
    

知道如何完成上述两项工作,或者如何让 UserControl 知道是时候刷新集合了吗?

4

2 回答 2

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 个香蕉。Banana 的销售数量发生了变化。由于您直接绑定到项目,因此不再需要额外的事件,视图(在您的情况下为用户控件)可以更新,而无需监听人工收集事件。

我对 Flash 知之甚少,但也许在您的用户控件中拥有一个托管 Flash 的转换器会有所帮助。至少您不必爬取所有列表,而只需爬取单个项目。

希望这可以帮助你

于 2012-07-19T16:49:42.360 回答
0

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

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

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

视图应该只显示 ViewModel 更新。

于 2012-07-19T16:26:16.317 回答