[英]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
事件添加一個事件處理程序。
我的回答是“不,不行”。 對於簡單的應用程序/原型,它很好,但是對於更高級的場景或養成良好的習慣/設置示例 - 它不是。
該怎么做? 沒有“一個尺寸適合所有答案”但我建議根據我的經驗:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.