Я схожу с ума, пытаясь понять это без успеха.
У меня есть 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>
Так как мне исправить привязку?