簡體   English   中英

屬性設置器是否可以使用MVVM模式產生副作用

[英]Is it OK for property setters to have side effects with the MVVM pattern

我正在編寫旨在解決標准問題的WPF應用程序。 我是WPF和MVVM模式的新手,所以在網上閱讀了大量不同的MVVM方法后,我的腦子里有點亂。 我想知道DataGrid的itemsource刷新操作的簡單操作對於MVVM來說是“慣用的”。

假設我有一個數據網格和一個組合框。 組合包含所有教練的列表。 數據網格顯示由所選教練訓練的所有運動員,因此組合就像數據網格中數據的過濾器:

<ComboBox ItemsSource="{Binding ListCoach}" DisplayMemberPath="last_name" SelectedValue=
"{Binding SelectedCoach}" SelectedValuePath="Id"/>

<DataGrid ItemsSource="{Binding Path=ListSportsman}" .....  </DataGrid>

我的ViewModel類在SelectedCoach屬性的setter中更改DataGrid的內容(此屬性是Combobox值的目標):

  private int _selectedCoach;
  public int SelectedCoach
  {
     get { return _selectedCoach; }
     set
     {
        _selectedCoach = value;
        ListSportsman = new ObservableCollection<sportsmanset>(_serviceAgent.ListSportsmanOfCoach(value));
        NotifyPropertyChanged(vm => vm.SelectedCoach);
     }
  }

這樣的代碼聞不到嗎? 或者,在SelectedCoach屬性中訂閱更改並在單獨的函數中設置ListSportsman更合適? (順便說一句,如何手動訂閱NotifyPropertyChanged事件?)

根據定義,這沒有錯,但有一點需要考慮:

一般來說,開發人員希望setter和getters能夠快速完成。 因此,如果要添加需要花費大量時間的邏輯,則可能需要異步執行該邏輯或使用Set方法替換該屬性,因此很明顯存在涉及的處理。

部分處理可能是設置View可以綁定的屬性。

不,這段代碼沒有'聞到'!

視圖模型與它“后退”的視圖密切相關。 在您描述的視圖中,這兩個屬性非常緊密耦合,因此它們在視圖模型中緊密耦合是有意義的。

另外,只要問問自己,擁有邏輯,填充數據網格,通過事件處理松散耦合會帶來什么好處? 這可以讓您更容易地執行此邏輯作為其他事件的結果,或者可能分成兩個類,以便在代碼中的其他位置重用。 這些情況中是否有可能出現? 如果沒有,讓你的代碼無緣無故變得更復雜就是代碼味道本身!

順便說一下,如果你想手動處理這個,你需要向類PropertyChanged事件添加一個事件處理程序。

我的回答是“不,不行”。 對於簡單的應用程序/原型,它很好,但是對於更高級的場景或養成良好的習慣/設置示例 - 它不是。

該怎么做? 沒有“一個尺寸適合所有答案”但我建議根據我的經驗:

  1. 始終保持setter啞,即只設置值和NotifyPropertyChanged。
  2. 嘗試將昂貴的業務邏輯和其他副作用封裝在命令中。 如果它不可能並且必須由setter觸發,則從PropertyChanged創建可觀察的Rx流並訂閱它。 這可能聽起來有點矯枉過正,但Rx對MVVM的好處是巨大的。 這是一種可能的(不是最好的)方法: http//blog.leifbattermann.de/2015/06/21/viewmodel-property-to-observable-stream/
  3. (offtopic但不是真的)也不會引起setter中簡單依賴只讀屬性的更改,而是使用https://github.com/StephenCleary/CalculatedProperties或類似(我懷疑此刻有什么更好的)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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