假设我有UserControl
并DependencyProperty
绑定到ObservableCollection<Foo>
对象。 Foo
对象的集合实际上被发送到某个Flash ActiveX对象。因此,我不能“WPF绑定”Foo对象的属性。
当Foo对象的属性由UserControl以外的其他内容更新时,我希望通知UserControl以便刷新(即将所有Foo对象重新发送到Flash对象)。
我不太清楚如何处理这个问题。我可以想到两个不那么明显的可能性:
UserControl订阅包含ObservableCollection<Foo>
对象的对象的某个事件。每当更改Foo对象的属性时,事件都会触发,因此UserControl会知道重新发送Flash对象的Foo对象。
让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;
}
....
我知道如何才能完成以上两个中的任何一个,或者我怎么能让UserControl知道是时候刷新这个集合了?
答案 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可以提供帮助。至少你这样做 不必抓取所有列表,只需抓取一个项目。
希望这有助于你