我疯狂地试图解决这个问题而没有成功。
我有一个DependencyObject,(“UserObject”)。它有一个“DataItems”DependecyProperty,它是一个ObservableCollection。 “UserDefiniton”是DependencyObject,其DependencyProperty为“Data”。数据有两个属性:DataType(枚举)和Value(字符串)。
我试图在XAML中定义一个ListBox,它使用“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属性(复选框的布尔值将显示在文本框中,即使隐藏了复选框)。
但基本上,在这种情况下绑定是有效的 - 但实现是不正确的。
所以,我转而使用模板。我遇到的问题是我无法使绑定工作。
这是我对模板的代码。 Template选择器工作正常,但TextBox的Text属性和复选框的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>
那么如何修复绑定?
答案 0 :(得分:3)
Content
应设置为{Binding}
,因为Content
将是数据模板的DataContext
,因此您应该只传递当前{{1} }}。如果需要将特定数据传递给模板选择器,则可以深入查看整个对象。
DataContext
级别上还有一个template selector,因此您不需要内部ListBox
。
(您可能也对generic methods of debugging data bindings感兴趣。)