0

私は本当にそれを取得しません。

次のような 2 つのオブジェクトを含むビューモデル クラスを作成しました。

public class MyViewModel{

public MyFirstObject FirstObject {get;set;}
public MySecondObject SecondObject {get;set;}

...
// Constructors and so on...
}

FirstObject は次のようになります。

public class MyFirstObject {

    public int Id {get;set;}
    ...
    // Constructors and so on...
    }

}

MySecondObject には Dictionary が含まれています。

    public class MySecondObject{

            public Dictionary<int, string> MyDict {get;set;}
            ...
            // Constructors and so on...
            }
}

私が今やりたいことは、キーのディクショナリ値を取得することです。これは MyFirstObject.Id への参照です - 次のように:

mySecondObject.myDict[myFirstObject.Id]

C# でこれを行うのは簡単ですが、今度は xaml でこれを行いたいと思います。UserControl を作成し、DataContext を MyViewModel 参照に設定しました。

その後、私はこれを試しました:

<TextBox Text={Binding SecondObject[FirstObject.Id]} ../>

残念ながら、キー「FirstObject.Id」が見つからないため、これは機能しません。

誰かがそれを修正する方法を知っていますか?

どうもありがとう!コード人食い人種

4

1 に答える 1

1

XAML ではこれを行わないでください。このロジックをカプセル化するビューモデルに新しいプロパティを作成するだけです。

PropertyChangedEvent値の変更を反映するように委任することもできます。

public class MyViewModel : INotifyPropertyChanged {

    private MyFirstObject firstObject;
    public MyFirstObject FirstObject
    {
        get { return firstObject; }
        set { firstObject = value; PropertyChanged("MyDictValue"); }
    }

    private MySecondObject secondObject;
    public MySecondObject SecondObject
    {
        get { return secondObject; }
        set
        {
            secondObject = value; PropertyChanged("MyDictValue");
            // you can subscribe here also for your MyDict changes if it is an
            // observable and you can call PropertyChanged("MyDictValue"); 
            // in the change event etc
        }
    }

    public string MyDictValue 
    { 
        get { return SecondObject.MyDict[FirstObject.Id]; } 
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    protected void RaisePropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

}

そして、新しいプロパティにバインドします:

<TextBox Text={Binding MyDictValue} ../>

このアプローチを使用すると、 内にifまたはis null などMyDictValueの処理などの追加のロジックを追加する場所ができます。FirstObjectSecondObject

于 2013-03-04T10:24:28.810 に答える