我有一个ItemsControl绑定到一组项目。这些项目具有名称和值属性。值属性是Object类型,以允许使用不同的数据类型。为了正确显示值属性,我使用ContentPresenter,对于可能使用的每种数据类型都有一个datatemplate。
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Path=Name}"/>
<GridSplitter Width="1"
Grid.RowSpan="4" Grid.Column="1"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
<ContentPresenter Grid.Column="2" Content="{Binding Value}">
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type System:String}">
<TextBox Text="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}"
BorderThickness="0"/>
</DataTemplate>
<DataTemplate DataType="{x:Type System:Int32}">
<TextBox Text="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}"
TextAlignment="Right"
BorderThickness="0"/>
</DataTemplate>
<DataTemplate DataType="{x:Type System:Double}">
<TextBox Text="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}"
TextAlignment="Right"
BorderThickness="0"/>
</DataTemplate>
<DataTemplate DataType="{x:Type System:Boolean}">
<CheckBox IsChecked="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}"
HorizontalAlignment="Center"/>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
ContentPresenter使用了正确的数据类型并且运行良好。我的问题在于编辑这些值对绑定的项没有任何影响。我怀疑是因为我绑定到ContentPresenter的内容属性而不是直接绑定到Value。我尝试过像这样使用ContentPresenter:
<ContentPresenter Grid.Column="2" Content="{Binding}">
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type System:String}">
<TextBox Text="{Binding Value}"
BorderThickness="0"/>
</DataTemplate>
但这种方法不会选中正确的DataTemplate,它只会显示对象而不是字符串。我也尝试了在DataTemplate的绑定中省略路径,像这样:
<DataTemplate DataType="{x:Type System:String}">
<TextBox Text="{Binding}" BorderThickness="0"/>
</DataTemplate>
我使用这个方法时出现了一个异常,告诉我要使用Path或XPath属性。
所以我的问题是:如何正确地绑定值,以便它显示正确的DataTemplate,并且对值的任何编辑都应用于绑定的项。
顺便说一下,由于某种原因,我问题中格式化的代码块在第一行之后缩进得更多。我尝试修复它,但我不明白发生了什么。
ContentPresenter
不应该在ControlTemplate
之外使用。从链接页面上可以看到:通常情况下,你会在ContentControl的ControlTemplate中使用ContentPresenter来指定内容添加的位置。 - Sheridan