给定一个数据对象:{List = new Int32[] {0, 1, 2, 3}, Index = 2}
我想使用以下语法将其绑定到控件:
{Binding List[Index]}
这不起作用并且不会引发任何异常。我也无法通过将转换器附加到此绑定来查看发生了什么。
只要我能做到,{Binding List[0]}
为什么这个不起作用:{Binding List[Index]}
?
给定一个数据对象:{List = new Int32[] {0, 1, 2, 3}, Index = 2}
我想使用以下语法将其绑定到控件:
{Binding List[Index]}
这不起作用并且不会引发任何异常。我也无法通过将转换器附加到此绑定来查看发生了什么。
只要我能做到,{Binding List[0]}
为什么这个不起作用:{Binding List[Index]}
?
您必须为此使用带有转换器的 MultiBinding,因为 Index 本身需要绑定。
例如
<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 提供):
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
解析 XAML 时会评估绑定表达式。因此,在那里使用的值必须是编译时常量,以便它们可以构建到稍后用于绑定的表达式中。
因此,一种方法是在您的 ViewModel 上创建一个属性,该属性公开您要绑定到的 List 的项目。
不幸的是,在这里使用 aValueConverter
也不是选项,因为您不能绑定到ConverterParameter
绑定表达式的 ,因此转换器也不知道索引...