索引器绑定

时间:2013-01-20 20:32:49

标签: c# wpf binding

这可能是一个非常愚蠢的问题,但我无法弄明白。 假设我有这两个类所代表的数据结构:

class Accessor
{
}


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

如果我也有这样的视图模型:

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

如何在XAML中定义CurrentRow[CurrentAccessor]绑定?我试过用 {Binding Path=CurrentRow[{Binding Path=CurrentAccessor}]},但这似乎不起作用。

更新:我应该指出Row类是一个实现INotifyCollectionChanged接口的集合,因此使用这样的简单属性包装器  如果存储在CurrentRow [CurrentAccessor]中的值发生变化,那么public object WrappedProperty { get{return CurrentRow[CurrentAccessor];}}将无效。

2 个答案:

答案 0 :(得分:2)

在ViewModel中,您可以创建其他属性。

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

现在绑定很简单:

{Binding Obj}

答案 1 :(得分:2)

您可以使用适当的转换器将绑定更改为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();
    }
}