0

標準的な問題を解決することを目的としたWPFアプリを作成しています。私はWPFとMVVMのパターンに本当に慣れていないので、インターネットでMVVMへのさまざまなアプローチをたくさん読んだ後、頭の中で少し混乱しています。DataGridのitemsource更新操作の簡単な操作がMVVMにとってどのように「慣用的」であるかを知りたいです。

1つのデータグリッドと1つのコンボボックスがあるとしましょう。コンボには、すべてのコーチのリストが含まれています。データグリッドには、選択したコーチによってトレーニングされたすべてのスポーツマンが表示されるため、コンボはデータグリッド内のデータのフィルターのように機能します。

<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

定義上は間違いではありませんが、考慮すべきことが1つあります。

一般に、開発者はセッターとゲッターが高速であることを期待しています。したがって、かなりの時間がかかるロジックを追加する場合は、そのロジックを非同期で実行するか、プロパティをSetメソッドに置き換えて、処理が含まれていることを明確にすることができます。

処理の一部は、ビューがバインドできるプロパティを設定することである可能性があります。

于 2015-09-03T18:44:27.300 に答える
0

いいえ、このコードは「においがしません」!

ビューモデルは、「バック」するビューと非常に密接に関連しています。説明するビューでは、これら2つのプロパティは非常に密接に結合されているため、ビューモデルで密接に結合されていることは理にかなっています。

また、イベント処理によって大まかに結合された、データグリッドにデータを取り込むロジックを使用すると、どのようなメリットが得られるでしょうか。これにより、他のイベントの結果としてこのロジックをより簡単に実行したり、コードの他の場所で再利用するために2つのクラスに分けたりすることができます。これらのシナリオのいずれかがありそうですか?そうでない場合、理由もなくコードをより複雑にすることは、コード自体の臭いです!

ちなみに、これを手動で処理したい場合は、クラスPropertyChangedイベントにイベントハンドラーを追加する必要があります。

于 2013-01-28T06:33:04.573 に答える
0

私の答えは「いいえ、それは大丈夫ではありません」です。単純なアプリ/プロトタイプの場合は問題ありませんが、より高度なシナリオや良い習慣/設定例を開発する場合は問題ありません。

代わりに何をしますか?「1つのサイズですべての答えに合う」というものはありませんが、私の経験に基づいて、次のことをお勧めします。

  1. 常にセッターをダムに保ちます。つまり、値とNotifyPropertyChangedのみを設定します。
  2. 高価なビジネスロジックやその他の副作用を、コマンドでカプセル化してみてください。それが不可能であり、setterによってトリガーされる必要がある場合は、PropertyChangedから監視可能なRxストリームを作成し、サブスクライブします。やり過ぎのように聞こえるかもしれませんが、MVVMに対するRxのメリットは計り知れません。これを行うための可能な(必ずしも最善ではない)方法は次のとおりです。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 に答える