Silverlight 这个绑定语法有什么问题:{binding List[Index]}?

Silverlight 这个绑定语法有什么问题:{binding List[Index]}?,silverlight,xaml,data-binding,Silverlight,Xaml,Data Binding,给定一个数据对象:{List=new Int32[]{0,1,2,3},Index=2},我希望使用以下语法将其绑定到控件: {Binding List[Index]} 这不起作用,也不会抛出任何异常。我也无法通过将转换器附加到此绑定来查看发生了什么 只要我能做{Binding List[0]}这个到底为什么不起作用:{Binding List[Index]}?在解析XAML时会计算绑定表达式。因此,在那里使用的值必须是编译时常量,以便可以将它们构建到稍后用于绑定的表达式中 因此,一种方法是在

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

{Binding List[Index]}
这不起作用,也不会抛出任何异常。我也无法通过将转换器附加到此绑定来查看发生了什么


只要我能做{Binding List[0]}这个到底为什么不起作用:{Binding List[Index]}?

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

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


不幸的是,这里也没有选择使用ValueConverter,因为您无法绑定到绑定表达式的ConverterParameter,因此转换器也不知道索引…

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

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


不幸的是,这里也没有使用ValueConverter的选项,因为您无法绑定到绑定表达式的ConverterParameter,因此转换器也不知道索引…

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

例如

和转换器:

公共类名称转换器:IMultiValueConverter { 公共对象Convertobject[]值,类型targetType,对象参数,CultureInfo区域性 { 如果values.Length!=2 | |!值[0]为IList | |!值[1]为int 不做任何事; var list=IListValue[0]; var指数=intvalues[1]; 如果索引<0 | |索引>=list.Count 不做任何事; 返回列表[索引]; } 公共对象[]ConvertBackobject值,类型[]targetTypes,对象参数,CultureInfo区域性 { 不做任何事; } } Silverlight的多绑定解决方案由谷歌提供:

SL3:

SL4:


SL5:

您必须使用带转换器的多重绑定,因为索引本身需要绑定

例如

和转换器:

公共类名称转换器:IMultiValueConverter { 公共对象Convertobject[]值,类型targetType,对象参数,CultureInfo区域性 { 如果values.Length!=2 | |!值[0]为IList | |!值[1]为int 不做任何事; var list=IListValue[0]; var指数=intvalues[1]; 如果索引<0 | |索引>=list.Count 不做任何事; 返回列表[索引]; } 公共对象[]ConvertBackobject值,类型[]targetTypes,对象参数,CultureInfo区域性 { 不做任何事; } } Silverlight的多绑定解决方案由谷歌提供:

SL3:

SL4:


SL5:

不幸的是,默认情况下Silverlight中没有IMultiValueConverter。您介意给出一个基于IValueConverterGreat解决方案的实现吗。我没有想到多重绑定,因为Silverlight本身不支持多重绑定……不幸的是,默认情况下Silverlight中没有IMultiValueConverter。您介意给出一个基于IValueConverterGreat解决方案的实现吗。我没有想到多重绑定,因为Silverlight本身不支持它。。。
<MyControl>
  <MyControl.Text>
    <MultiBinding Converter="{StaticResource yourConverter}">
      <MultiBinding.Bindings>
        <Binding Path="List" />
        <Binding Path="Index" />
      </MultiBinding.Bindings>
    </MultiBinding>
  </MyControl.Text>
</MyControl>