C# 属性设置程序对MVVM模式有副作用可以吗

C# 属性设置程序对MVVM模式有副作用可以吗,c#,wpf,data-binding,mvvm,simple-mvvm,C#,Wpf,Data Binding,Mvvm,Simple Mvvm,我正在编写WPF应用程序,旨在解决标准问题。我对WPF和MVVM模式真的很陌生,所以在阅读了大量关于internet上MVVM的不同方法后,我的头脑有点混乱。我想知道我对DataGrid的itemsource刷新操作的简单操作对MVVM来说是如何“惯用”的 假设我有一个数据网格和一个组合框。该组合包含所有Coach的列表。datagrid显示由选定教练训练的所有运动员,因此组合就像datagrid中的数据过滤器: <ComboBox ItemsSource="{Binding ListCo

我正在编写WPF应用程序,旨在解决标准问题。我对WPF和MVVM模式真的很陌生,所以在阅读了大量关于internet上MVVM的不同方法后,我的头脑有点混乱。我想知道我对DataGrid的itemsource刷新操作的简单操作对MVVM来说是如何“惯用”的

假设我有一个数据网格和一个组合框。该组合包含所有Coach的列表。datagrid显示由选定教练训练的所有运动员,因此组合就像datagrid中的数据过滤器:

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

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


不,此代码没有“气味”

视图模型与它“支持”的视图密切相关。在您描述的视图中,这两个属性是紧密耦合的,因此在视图模型中它们紧密耦合是有意义的

另外,问问你自己,拥有通过事件处理松散耦合的填充数据网格的逻辑会带来什么好处?这可以让您更容易地在其他事件的结果中执行此逻辑,或者将其分为两个类,以便在代码的其他地方重用。这些情况有可能发生吗?如果不是,那么毫无理由地让代码变得更复杂本身就是一种代码味道


顺便说一下,如果您确实希望手动处理此问题,则需要将事件处理程序添加到类
PropertyChanged
事件中。

从定义上讲,这没有错,但有一点需要考虑:

一般来说,开发人员希望setter和getter速度更快。因此,如果您添加的逻辑需要相当长的时间,那么您可能希望异步执行该逻辑,或者用Set方法替换该属性,这样就可以清楚地看出其中涉及到处理

处理的一部分可能是设置视图可以绑定到的属性。

我的回答是“不,它不好”。对于简单的应用程序/原型来说,这很好,但是对于更高级的场景或者培养良好的习惯/树立榜样来说,情况并非如此

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

  • 始终保持setter为哑巴,即仅设置值和NotifyPropertyChanged
  • 尝试在命令中封装昂贵的业务逻辑和其他副作用。如果这是不可能的,并且必须由setter触发,那么从PropertyChanged创建可观察的Rx流并订阅它。这听起来可能有些过分,但Rx对MVVM的好处是巨大的。 这里有一个可能的(不一定是最好的)方法:
  • (offtopic,但不是真的)也不会在setter中引起简单依赖只读属性的更改,而是使用或类似的方法(我怀疑目前是否有更好的方法)

  • 不仅如此,当异步变得相关时,更明显的是某些事情是异步发生的。
      private int _selectedCoach;
      public int SelectedCoach
      {
         get { return _selectedCoach; }
         set
         {
            _selectedCoach = value;
            ListSportsman = new ObservableCollection<sportsmanset>(_serviceAgent.ListSportsmanOfCoach(value));
            NotifyPropertyChanged(vm => vm.SelectedCoach);
         }
      }