题
我有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>
正如你所看到的,唯一的区别是,他们使用不同的转换器,用于绑定TextBlock的Text属性。有没有什么办法,我分析出这两个的DataTemplates的共性?我有6以上且更新它们越来越非常繁琐的,因为一切是除了转换为文本属性的结合相同。
有没有办法以某种方式考虑此因素伸到它可以在某种程度上被参数化一个模板?像这样将降温(伪代码):
<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>
其他提示
您可以尝试一个路径是创建一个新的用户控制。
此用户控制应包含的StackPanel,这StackPanel中应包含文本框,标签和文本框。
您可以实现TextConverters作为依赖属性。
最后一组的DataTemplates的是这样的:
<DataTemplate x:Key="ConflictFieldStringCellContentTemplate">
<local:VersionDisplayControl
ClientVersionTextConverter="{StaticResource stringArrayToCommaDelimitedStringConverter}" />
</DataTemplate>
<DataTemplate x:Key="ConflictFieldStringArrayCellContentTemplate">
<local:VersionDisplayControl
ClientVersionTextConverter="{StaticResource stringArrayToCommaDelimitedStringConverter}"
ServerVersionTextConverter="{StaticResource stringArrayToCommaDelimitedStringConverter}" />
</DataTemplate>
这是假设用户控制能够从一些全局可用源访问源版本信息。 如果不是, VersionDisplayControl 将要暴露的另一个公共财产,大概是叫 VersionSource 。
不隶属于 StackOverflow