我有一个DataGrid
和一个视图模型(MyViewModel1
)。绑定到的DataGrid
Items 属性MyViewModel1
。限制是我不能触摸MyViewModel1
and的代码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 列,而且还显示每行的第 4 列,DataGrid
这取决于Property1
、Property2
、Property3
和。为了这个例子,假设第 4 列是. 第 4 列必须显示当前值,因此如果增加 1,则第 4 列也必须增加 1。我的问题是:我有什么选择来做到这一点?ViewModelProperty1
ViewModelProperty2
Property1 + Property2 + Property3 + ViewModelProperty1 + ViewModelProperty2
ViewModelProperty1
我能想到这些:
使用
IMultiValueConverter
带有所有因变量的 an 作为输入。这适用于示例。这里的问题是,一旦变量的交互变得更加复杂,例如((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(转换器和包装器)之外,还有哪些方法可以解决这个问题。
我的问题不是哪种方法是解决示例的最佳方法。