我有 8 个不同的 XAML DataTemplates,它们都非常相似。以下是其中 2 个:

<DataTemplate x:Key="ConflictFieldStringCellContentTemplate">
    <StackPanel>
        <TextBlock Text="{Binding ClientVersion.Value}"
                   Foreground="{Binding Path=Mismatch, Converter={StaticResource mismatchBoolToBrushConverter}}" />
        <Label Background="LightGray" Height="1" Margin="0, 4, -4, 2"></Label>
        <TextBlock Text="{Binding ServerVersion.Value}"
                   Foreground="{Binding Path=Mismatch, Converter={StaticResource mismatchBoolToBrushConverter}}"/>
    </StackPanel>
</DataTemplate>

<DataTemplate x:Key="ConflictFieldStringArrayCellContentTemplate">
    <StackPanel>
        <TextBlock Text="{Binding ClientVersion.Value, Converter={StaticResource stringArrayToCommaDelimitedStringConverter}}"
                   Foreground="{Binding Path=Mismatch, Converter={StaticResource mismatchBoolToBrushConverter}}"/>
        <Label Background="LightGray" Height="1" Margin="0, 4, -4, 2"></Label>
        <TextBlock Text="{Binding ServerVersion.Value, Converter={StaticResource stringArrayToCommaDelimitedStringConverter}}"
                   Foreground="{Binding Path=Mismatch, Converter={StaticResource mismatchBoolToBrushConverter}}"/>
    </StackPanel>
</DataTemplate>

如您所见,唯一的区别是它们使用不同的转换器来绑定(bind) TextBlock 的 Text 属性。有什么办法可以让我找出这两个 DataTemplates 的共同点吗?我还有 6 个并且更新它们变得非常乏味,因为除了用于文本属性绑定(bind)的转换器之外,所有内容都是相同的。

有没有办法以某种方式将其分解为一个可以以某种方式参数化的模板?这样的东西会很酷(伪代码):
<DataTemplate x:Key="BaseCellContentTemplate">
    <StackPanel>
        <TextBlock Text="{??}"
                   Foreground="{Binding Path=Mismatch, Converter={StaticResource mismatchBoolToBrushConverter}}" />
        <Label Background="LightGray" Height="1" Margin="0, 4, -4, 2"></Label>
        <TextBlock Text="{Binding ServerVersion.Value}"
                   Foreground="{Binding Path=Mismatch, Converter={StaticResource mismatchBoolToBrushConverter}}"/>
    </StackPanel>
</DataTemplate>

<DataTemplate x:Key="ConflictFieldStringCellContentTemplate" BaseTemplate="BaseCellContentTemplate">
    <??>{Binding ClientVersion.Value}</??>
</DataTemplate>

<DataTemplate x:Key="ConflictFieldStringArrayCellContentTemplate" BaseTemplate="BaseCellContentTemplate">

    <??>{Binding ClientVersion.Value, Converter={StaticResource stringArrayToCommaDelimitedStringConverter}}</??>
</DataTemplate>

最佳答案

如果只有一个值,并且您想纯粹使用模板来实现,您可以这样做:

<DataTemplate x:Key="VersionDisplayTemplate">
    <StackPanel>
        <TextBlock Text="{TemplateBinding Tag}"
                   Foreground="{Binding Path=Mismatch, Converter={StaticResource mismatchBoolToBrushConverter}}" />
        <Label Background="LightGray" Height="1" Margin="0, 4, -4, 2"></Label>
        <TextBlock Text="{TemplateBinding Content}"
                   Foreground="{Binding Path=Mismatch, Converter={StaticResource mismatchBoolToBrushConverter}}"/>
    </StackPanel>
</DataTemplate>

现在您可以将其用作:
<DataTemplate x:Key="ConflictFieldStringCellContentTemplate">
   <ContentPresenter
       Tag="ABC"
       Content="{Binding ClientVersion.Value}"
       ContentTemplate="{StaticResource VersionDisplayTemplate}"
       />
</DataTemplate>

<DataTemplate x:Key="ConflictFieldStringArrayCellContentTemplate">
   <ContentPresenter
       Tag="XYZ"
       Content="{Binding ClientVersion.Value, Converter={StaticResource stringArrayToCommaDelimitedStringConverter}}"
       ContentTemplate="{StaticResource VersionDisplayTemplate}"
       />
</DataTemplate>

关于wpf - 如何结合我看似多余的 XAML,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1646783/

10-11 22:08
查看更多