簡體   English   中英

如何將WPF UserControl掛鈎到綁定的ViewModel對象的事件?

[英]How can I hook a WPF UserControl to an event of a bound ViewModel object?

假設我有一個帶有DependencyPropertyUserControl綁定到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; } .... 

知道如何完成以上兩個操作中的任何一個,或者如何使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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM