2

DataGridビュー モデル ( MyViewModel1) があります。はのDataGridItems プロパティにバインドされていますMyViewModel1MyViewModel1制約は、とのコードに触れることができないことです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 増加する必要があります。私の質問は次のとおりです。これを行うためのオプションは何ですか?Property1Property2Property3ViewModelProperty1ViewModelProperty2Property1 + Property2 + Property3 + ViewModelProperty1 + ViewModelProperty2ViewModelProperty1

私はこれらを考えることができます:

  1. IMultiValueConverterすべての従属変数を入力として使用します。これは、この例ではうまく機能します。ここでの問題は、変数の相互作用がより複雑になるとすぐに、たとえば((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

申し訳ありませんが、あなたがすでにこれを考えているのを見ました! 私はあなたの反論を理解していません。

IMul​​tiValueConverterMultiBindingを使用できます。IMul​​tiValueConverter ドキュメントの例を参照してください。

(ここから: https://stackoverflow.com/a/2002598/360211 )

于 2012-12-11T21:01:22.900 に答える