使用模板绑定ListBox项

时间:2011-12-09 20:18:06

标签: wpf xaml binding listbox controltemplate

我疯狂地试图解决这个问题而没有成功。

我有一个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>

那么如何修复绑定?

1 个答案:

答案 0 :(得分:3)

Content应设置为{Binding},因为Content将是数据模板的DataContext,因此您应该只传递当前{{1} }}。如果需要将特定数据传递给模板选择器,则可以深入查看整个对象。

DataContext级别上还有一个template selector,因此您不需要内部ListBox

(您可能也对generic methods of debugging data bindings感兴趣。)