在related question中,我询问了绑定到另一个属性索引的数组的特定元素。提供的答案非常适用于提供的示例代码示例。
我遇到麻烦的是我为ListBox指定了ItemSource,当我单步执行时,我在转换器中得到了DependencyProperty.UnsetValue。毫无疑问,这是我对Binding的理解的问题。
我的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(value [0])为 DependencyProperty.UnsetValue - 对象数组正如我所期望的那样。
我假设它是一个绑定问题: 因为它不知道MyIndex是什么。
如果MyIndex是SomeData类的属性,它可以像我期望的那样工作,但它不是,它是MainWindow类的属性,就像MyList一样。
如何指定我对属于DataContext而不是MyData List的MyIndex属性感兴趣?
答案 0 :(得分:1)
它正在查找ListBoxItem上的MyIndex属性(在本例中为SomeData类),并且该属性不存在。
将绑定中的ElementName设置为窗口名称,以使其在其他位置查找属性。
<Binding ElementName=RootWindow, Path=DataContext.MyIndex />