0

我正在编写旨在解决标准问题的 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 属性的设置器中更改 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 事件?)

4

3 回答 3

2

根据定义,这并没有错,但需要考虑一件事:

一般来说,开发人员希望 setter 和 getter 速度快。因此,如果您要添加需要大量时间的逻辑,您可能希望异步执行该逻辑或用 Set 方法替换属性,以便清楚地知道涉及到处理。

部分处理可能是设置 View 可以绑定的属性。

于 2015-09-03T18:44:27.300 回答
0

No, this code does not 'smell'!

A view-model is very closely associated with the view that it 'backs'. In the view you describe, these two properties are very closely coupled, therefore it would make sense that they are tightly coupled in your view model.

Also, just ask yourself, what benefit would it give to have the logic, that populates the data grid, loosely coupled by event handling? This could allow you to more easily execute this logic as the result of some other event, or perhaps separate into two classes for re-use elsewhere in your code. Are any of these scenarios likely? If not, making your code more complex for no reason is a code smell in itself!

By the way if you do want to handle this manually, you need to add an event handler to the classes PropertyChanged event.

于 2013-01-28T06:33:04.573 回答
0

我的回答是“不,这不好”。好吧,对于简单的应用程序/原型来说很好,但是对于更高级的场景或养成良好的习惯/树立榜样 - 它不是。

该怎么做?没有“一刀切的答案”,但根据我的经验,我建议:

  1. 始终保持设置者愚蠢,即仅设置值和 NotifyPropertyChanged。
  2. 尝试将昂贵的业务逻辑和其他副作用封装在命令中。如果不可能并且必须由 setter 触发,则从 PropertyChanged 创建可观察的 Rx 流并订阅它。听起来可能有点矫枉过正,但 Rx 对 MVVM 的好处是巨大的。这是一种可能的(不一定是最好的)方法:http: //blog.leifbattermann.de/2015/06/21/viewmodel-property-to-observable-stream/
  3. (离题但不是真的)也不会在 setter 中引发简单依赖只读属性的更改,而是使用https://github.com/StephenCleary/CalculatedProperties或类似的(我怀疑目前有什么更好的)
于 2017-01-04T11:14:04.103 回答