WPF ListBox Binding ItemsSource - PullRequest
       0

WPF ListBox Binding ItemsSource

0 голосов
/ 05 ноября 2010

В связанном вопросе Я спросил о привязке к определенному элементу массива, проиндексированному другим свойством. Предоставленный ответ сработал очень хорошо для предоставленного примера кода.

Проблема, с которой я сталкиваюсь, заключается в том, что я указываю ItemSource для ListBox и получаю 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 (значение [0]) равно DependencyProperty.UnsetValue - массив объектов соответствует ожиданиям.

Я предполагаю, что это проблема Binding с: в том, что он не знает, что такое MyIndex.

Если бы MyIndex был свойством класса SomeData, он работал бы так, как я ожидал, но это не так, это свойство класса MainWindow, как и MyList.

Как мне указать, что меня интересует свойство MyIndex, являющееся частью моего DataContext, а не списка MyData?

1 Ответ

1 голос
/ 05 ноября 2010

Он ищет свойство MyIndex в ListBoxItem (в данном случае это класс SomeData), и это свойство не существует.

Установите ElementName в вашей привязке к имени окна, чтобы оно могло искать свойство в другом месте.

<Binding ElementName=RootWindow, Path=DataContext.MyIndex />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...