0

これはおそらく非常に愚かな質問ですが、私はそれを理解することができません。これらの2つのクラスで表されるデータ構造があると仮定します。

class Accessor
{
}


class Row : INotifyCollectionChanged
{
    public object this[Accessor index] {get;}
}

そして、私もこのようなビューモデルを持っている場合:

class ViewModel
{
     public Row CurrentRow{get;}
     public Accessor CurrentAccessor {get;}
}

CurrentRow[CurrentAccessor]XAMLでバインディングを定義するにはどうすればよいですか?を使ってみ {Binding Path=CurrentRow[{Binding Path=CurrentAccessor}]}ましたが、うまくいかないようです。

更新:INotifyCollectionChanged Rowクラスはインターフェイスを実装するコレクションであるため、このような単純なプロパティラッパーを使用しても機能しないことを指摘しておく必要があります。
public object WrappedProperty { get{return CurrentRow[CurrentAccessor];}}それ以降、CurrentRow[CurrentAccessor]に格納されている値が変更されても更新は行われません。

4

2 に答える 2

2

適切なコンバーターを使用して、Binding をMultiBindingに変更できます。

<MultiBinding Converter="{StaticResource RowAccessorConverter}">
    <Binding Path="CurrentRow"/>
    <Binding Path="CurrentAccessor"/>
</MultiBinding>

コンバーターは次のようになります。

public class RowAccessorConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var row = values[0] as Row;
        var accessor = values[1] as Accessor;
        return row[accessor];
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}
于 2013-01-20T21:13:48.390 に答える
2

ViewModel では、追加のプロパティを作成できます。

class ViewModel
{
     public object Obj { get { return CurrentRow[CurrentAccessor]; } }
     public Row CurrentRow{ get; }
     public Accessor CurrentAccessor { get; }
}

そしてバインディングは簡単になりました:

{Binding Obj}
于 2013-01-20T20:38:29.790 に答える