[英]How can I hook a WPF UserControl to an event of a bound ViewModel object?
假設我有一個帶有DependencyProperty
的UserControl
綁定到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知道是時候刷新集合了嗎?
這里似乎有些不對勁。 您用MVVM標記了該帖子,所以我想您正在使用它。
看到,有了Model,View,ViewModel,您應該在ViewModel和Model之間進行這項工作。 因此,ViewModel將訂閱模型的事件並進行更新。 如果模型沒有此類事件,則繼承並添加它。 然后,因為ViewModel實現了INotifyPropertyChanged,並且因為它使用了ObservableCollection,所以視圖將已經更新。
獲取ViewModel的ObservableCollection進行更改,而不必讓UserControl訂閱任何事件。
該視圖應僅顯示ViewModel更新。
您應該考慮擁有多個ViewModel。
如果您對ViewModel中的某個項目發生的更改感興趣,請為這些Items創建一個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知之甚少,但也許在用戶控件中擁有一個托管Flash的轉換器會有所幫助。 至少您不必搜尋所有列表,而只需搜尋一個項目。
希望這對您有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.