Связывание элементов ListBox с использованием шаблонов - PullRequest
1 голос
/ 10 декабря 2011

Я схожу с ума, пытаясь понять это без успеха.

У меня есть DependencyObject, ("UserObject"). У него есть свойство DependecyProperty «DataItems», которое является коллекцией ObservableCollection. «UserDefiniton» - это объект DependencyObject с свойством DependencyProperty «Данные». У данных есть два свойства: DataType (перечисление) и Value (строка).

Я пытаюсь определить ListBox в XAML, который использует свойство «DataItems» в качестве его ItemsSource. В ItemTemplate у меня есть несколько разных элементов управления. Для простоты этого вопроса я использую CheckBox и TextBox. Я хочу, чтобы CheckBox был доступен и виден, когда DataType равен 0, а я хочу, чтобы TextBox был доступен и виден, когда DataType равен 1. Только один элемент управления может быть доступен и виден одновременно.

Это работает:

<ListBox
    ItemsSource={Binding DataItems, Mode=OneWay}>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <CheckBox
                    Visibility="{Binding Path=Data.DataType, Mode=OneWay, Converter={StaticResource VisibilityConverter}, ConverterParameter=0}"
                    IsChecked="{Binding Path=Data.Value, Mode=TwoWay, Converter={StaticResource StringToBoolean}}" />
                <TextBox
                    Visibility="{Binding Path=Data.DataType, Mode=OneWay, Converter={StaticResource VisibilityConverter}, ConverterParameter=1}"
                    Text="{Binding Path=Data.Value, Mode=TwoWay}" />
            </StackPanel>
        </DataTemplate>
    <Listbox.ItemTemplate>
</ListBox>

Проблема в том, что, хотя виден только один, оба сражаются за свойство Data.Value (логическое значение флажка будет отображаться в текстовом поле, даже если флажок скрыт).

В принципе, в этом случае привязка работает, но реализация неверна.

Итак, я перешел на использование шаблонов. Проблема в том, что я не могу заставить работать.

Это код, который у меня есть для шаблона. Селектор шаблонов работает правильно, но свойство Text элемента TextBox и свойство IsChecked флажка не привязываются к Data.Value:

  <DataTemplate x:Key="TextBoxItem">
                <TextBox
                    Text="{Binding Path=Data.Value, Mode=TwoWay}" />
  </DataTemplate>
  <DataTemplate x:Key="CheckBoxItem">
                <CheckBox
                    IsChecked="{Binding Path=Data.Value, Mode=TwoWay, Converter={StaticResource StringToBoolean}}" />
  </DataTemplate>


...

<ListBox
    ItemsSource={Binding DataItems, Mode=OneWay}>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ContentControl
                Content="{Binding Path=Data.DataType, Mode=OneWay}"
                         ContentTemplateSelector="{DynamicResource UserDefinitionTemplateSelector}"/>

        </DataTemplate>
    <ListBox.ItemTemplate>
</ListBox>

Так как мне исправить привязку?

1 Ответ

3 голосов
/ 10 декабря 2011

Content должно быть установлено на {Binding}, поскольку Content будет DataContext шаблонов данных, следовательно, вы должны просто передать текущий DataContext.Если вам нужно передать определенные данные в селектор шаблонов, вы можете просто развернуть весь объект.

Также на уровне ListBox есть селектор шаблонов , так чтона самом деле не нужны внутренние ContentControl.

(Вас также могут заинтересовать универсальные методы отладки привязок данных .)

...