WPF ListBox绑定ItemsSource

时间:2010-11-05 14:59:08

标签: wpf data-binding

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属性感兴趣?

1 个答案:

答案 0 :(得分:1)

它正在查找ListBoxItem上的MyIndex属性(在本例中为SomeData类),并且该属性不存在。

将绑定中的ElementName设置为窗口名称,以使其在其他位置查找属性。

<Binding ElementName=RootWindow, Path=DataContext.MyIndex />