В related question я спросил о привязке к определенному элементу массива, индексированного другим свойством. Полученный ответ очень сработал для примера примера кода.WPF ListBox Binding ItemsSource
Где я столкнулся с трудностями, так это то, что я указываю ItemSource для ListBox, и я получаю DependencyProperty.UnsetValue в своем конвертере, когда я его просматриваю. Без сомнения, это проблема с моим пониманием Связывания.
Мой ListBox выглядит так:
<ListBox ItemsSource="{Binding Path=MyList}">
<ListBox.Resources>
<local:FoodIndexConverter x:Key="indexConverter" />
</ListBox.Resources>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource indexConverter}">
<Binding Path="MyIndex" />
<Binding Path="Fields" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
и код позади выглядит так:
public MainWindow()
{
InitializeComponent();
MyList.Add(new SomeData() { Fields = new object[] {"liver", "onions", "cake" } });
MyList.Add(new SomeData() { Fields = new object[] {"liver", "onions", "candy" } });
MyList.Add(new SomeData() { Fields = new object[] {"liver", "onions", "pie" } });
DataContext = this;
}
MyList является список.
MyIndex - это int.
Преобразователь код
public class FoodIndexConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values == null || values.Length != 2)
return null;
int? idx = values[0] as int?;
object[] food = values[1] as object[];
if (!idx.HasValue || food == null)
return null;
return food[idx.Value];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Когда я шаг через отладчик в конвертере коде MyIndex (значение [0]) является DependencyProperty.UnsetValue - массив объект, как я бы ожидать.
Я предполагаю, что это проблема, связанная с: тем, что она не знает, что такое MyIndex.
Если MyIndex был свойством класса SomeData, он работает так, как я ожидал бы, но это не так, это свойство класса MainWindow, как и MyList.
Как указать, что меня интересует свойство MyIndex, которое является частью моего DataContext, а не списка MyData?
Да - отлично. Работал как чемпион. Хороший день - я чему-то научился. :) – itsmatt