{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]}
?
インデックス自体をバインドする必要があるため、これにはコンバーターでマルチバインドを使用する必要があります。
例えば
<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が解析されているときに評価されます。したがって、そこで使用される値はコンパイル時定数である必要があります。これにより、後でバインディングに使用される式に組み込むことができます。
したがって、1つの方法は、バインドするリストのアイテムを公開するプロパティをViewModelに作成することです。
残念ながら、ValueConverter
ここでもオプションはありません。これは、バインディング式のにバインドできないConverterParameter
ため、コンバーターもインデックスを認識しないためです...