这种绑定语法有什么问题:{Binding List [Index]}?

时间:2012-12-04 12:55:44

标签: silverlight xaml data-binding

给定一个数据对象:{List = new Int32[] {0, 1, 2, 3}, Index = 2}我想使用以下语法绑定到控件:

{Binding List[Index]}

哪个不起作用,不会抛出任何异常。我无法通过将转换器附加到此绑定来查看发生了什么。

只要我可以{Binding List[0]}为什么在地球上这个不起作用:{Binding List[Index]}

2 个答案:

答案 0 :(得分:4)

为此必须使用带转换器的MultiBinding,因为索引本身需要绑定。

E.g。

<MyControl>
  <MyControl.Text>
    <MultiBinding Converter="{StaticResource yourConverter}">
      <MultiBinding.Bindings>
        <Binding Path="List" />
        <Binding Path="Index" />
      </MultiBinding.Bindings>
    </MultiBinding>
  </MyControl.Text>
</MyControl>

转换器:

public class NameConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Length != 2 || !(values[0] is IList<MyItemType>) || !(values[1] is int))
            return Binding.DoNothing;

        var list = (IList<MyItemType>)values[0];
        var index = (int)values[1];

        if (index < 0 || index >= list.Count)
            return Binding.DoNothing;

        return list[index];
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

Silverlight的多重绑定解决方案(由Google提供):

SL3:http://www.olsonsoft.com/blogs/stefanolson/post/Improvements-to-Silverlight-Multi-binding-support.aspx

SL4:http://www.scottlogic.co.uk/blog/colin/2010/05/silverlight-multibinding-solution-for-silverlight-4/

SL5:http://www.codeproject.com/Articles/286171/MultiBinding-in-Silverlight-5

答案 1 :(得分:0)

在解析XAML时会评估绑定表达式。因此,那里使用的值必须是编译时常量,以便它们可以构建到稍后用于绑定的表达式中。

因此,一种方法是在ViewModel上创建一个属性,公开要绑定的List项。

遗憾的是,使用ValueConverter也没有选项,因为你无法绑定到绑定表达式的ConverterParameter,因此转换器也不会知道索引......