2

我有一个DataGrid和一个视图模型(MyViewModel1)。绑定到的DataGridItems 属性MyViewModel1。限制是我不能触摸MyViewModel1and的代码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这取决于Property1Property2Property3和。为了这个例子,假设第 4 列是. 第 4 列必须显示当前值,因此如果增加 1,则第 4 列也必须增加 1。我的问题是:我有什么选择来做到这一点?ViewModelProperty1ViewModelProperty2Property1 + Property2 + Property3 + ViewModelProperty1 + ViewModelProperty2ViewModelProperty1

我能想到这些:

  1. 使用IMultiValueConverter带有所有因变量的 an 作为输入。这适用于示例。这里的问题是,一旦变量的交互变得更加复杂,例如((Property1 + 2*Property2) * Property3) ^ (ViewModelProperty1 - ViewModelProperty2),将 5 个变量放入“MultiBinding”的顺序变得很重要,并且绑定中有很多知识可以导致解决方案变脆。

  2. 使用包装器。将 绑定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(转换器和包装器)之外,还有哪些方法可以解决这个问题。

我的问题不是哪种方法是解决示例的最佳方法。

4

1 回答 1

0

对不起,我刚刚看到你已经想到了这个!并不是说我理解你的反对意见。

您可以将MultiBindingIMultiValueConverter一起使用。请参阅 IMultiValueConverter 文档中的示例。

(从这里:https ://stackoverflow.com/a/2002598/360211 )

于 2012-12-11T21:01:22.900 回答