とDataGrid
ビュー モデル ( MyViewModel1
) があります。はのDataGrid
Items プロパティにバインドされていますMyViewModel1
。MyViewModel1
制約は、とのコードに触れることができないことですMyClass1
。
public class MyViewModel1 : INotifyPropertyChanged
{
...
public ObservableCollection<MyClass1> Items { get { ... } }
public int ViewModelProperty1 { get { ... } }
public int ViewModelProperty2 { get { ... } }
}
public class MyClass1 : INotifyPropertyChanged
{
...
public int Property1 { get { ... } }
public int Property2 { get { ... } }
public int Property3 { get { ... } }
}
3 つの既知のプロパティを含む 3 つの列だけでなく、 、、、およびDataGrid
に依存する各行の 4 番目の列も表示したいと思います。例として、4 番目の列が であるとしましょう。4 列目は現在の値を表示する必要があるため、が 1 増加すると、4 列目も 1 増加する必要があります。私の質問は次のとおりです。これを行うためのオプションは何ですか?Property1
Property2
Property3
ViewModelProperty1
ViewModelProperty2
Property1 + Property2 + Property3 + ViewModelProperty1 + ViewModelProperty2
ViewModelProperty1
私はこれらを考えることができます:
IMultiValueConverter
すべての従属変数を入力として使用します。これは、この例ではうまく機能します。ここでの問題は、変数の相互作用がより複雑になるとすぐに、たとえば((Property1 + 2*Property2) * Property3) ^ (ViewModelProperty1 - ViewModelProperty2)
5 つの変数が「MultiBinding」に配置される順序が重要になり、ソリューションを引き起こす可能性のあるバインディングに多くの知識があることです。もろくなる。ラッパーを使用します。
DataGrid
を新しいクラスにバインドします。これは、のMyViewModel2
変更に登録されMyViewModel1
、次のようになります。public class MyViewModel2 { public MyViewModel2(MyViewModel1 m) { ... } ... public ObservableCollection<MyClass2> Items { get { ... } } } public class MyClass2 : INotifyPropertyChanged { public MyClass2(MyClass1 inner) { InnerClass = inner; InnerClass.NotifyPropertyChanged += InnerClassChanged; } void InnerClassChanged(object o, PropertyChangedEventArgs) { if (PropertyChanged != null) PropertyChanged("Property4"); } public void ViewModelPropertiesChanged { if (PropertyChanged != null) PropertyChanged("Property4"); } public MyClass1 InnerClass { get; private set; } public int Property4 { get { return InnerClass.Property1+InnerClass.Property2 ... } } public event PropertyChanged; }
問題は、上記の 2 つ (コンバーターとラッパー) に加えて、この問題を解決するためにどのような方法があるかということです。
私の質問は、どの方法が例を解決するための最良の方法であるかではありません。