我有一个常见的DataTemplate, NameTemplate ,我在其他DataTemplates中使用。我故意不定义 FontSize 和 FontFamily 属性,以便消费的DataTemplate可以设置TextElement附加属性并具有 NameTemplate 的TextBlock继承这些属性。
问题是 NameTemplate 中的TextBlock不会继承那些TextElement附加属性。请参阅下面的代码和我解决问题的工作方案。
我发帖询问是否有更好的方法来解决这个问题,也许解释为什么我的解决方案有效?此外,在这篇文章的最后是一个关于我对此解决方案的另一个问题的问题。
这是 NameTemplate ;
<DataTemplate x:Key="NameTemplate" DataType="{x:Type common:Contact}">
<TextBlock>
<Run Text="{Binding Title, Mode=OneWay}"/>
<Run Text="{Binding FirstName, Mode=OneWay}"/>
<Run Text="{Binding MiddleInitial, Mode=OneWay, TargetNullValue='', FallbackValue='', StringFormat='{}{0}. '}"/><Run Text="{Binding LastName, Mode=OneWay}"/>
</TextBlock>
</DataTemplate>
以下是使用DataTemplate的示例;
<DataTemplate DataType="{x:Type common:Contact}">
<StackPanel>
<ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource NameTemplate}" Style="{StaticResource SubHeadingTextElementStyle}"/>
<!-- Other Template Stuff -->
</StackPanel>
</DataTemplate>
Style SubHeadingTextElementStyle 看起来像这样;
<Style x:Key="SubHeadingTextElementStyle" BasedOn="{StaticResource DefaultTextElementStyle}">
<Setter Property="TextElement.FontFamily" Value="{telerik:Windows8Resource ResourceKey=FontFamily}"/>
<Setter Property="TextElement.FontSize" Value="{telerik:Windows8Resource ResourceKey=FontSizeL}"/>
</Style>
为了使这项工作符合预期,我必须将以下绑定添加到 NameTemplate TextBlock;
<DataTemplate x:Key="NameTemplate" DataType="{x:Type common:Contact}">
<TextBlock FontSize="{Binding (TextElement.FontSize), RelativeSource={RelativeSource Self}}" FontFamily="{Binding (TextElement.FontFamily), RelativeSource={RelativeSource Self}}"
Foreground="{Binding (TextElement.Foreground), RelativeSource={RelativeSource Self}}" FontWeight="{Binding (TextElement.FontWeight), RelativeSource={RelativeSource Self}}">
<Run Text="{Binding Title, Mode=OneWay}"/>
<Run Text="{Binding FirstName, Mode=OneWay}"/>
<Run Text="{Binding MiddleInitial, Mode=OneWay, TargetNullValue='', FallbackValue='', StringFormat='{}{0}. '}"/><Run Text="{Binding LastName, Mode=OneWay}"/>
</TextBlock>
</DataTemplate>
注意RelativeSource Self绑定到TextElement附加属性。
我在这个方法中遇到的另一个问题是,在我的一个消费模板中,我将TextElement.FontWeight属性设置为与BooleanToFontWeightConverter的绑定 - 这个绑定不起作用 - 值转换器的Convert方法是从未打电话过我认为这是由于我已经实现的解决方案,因为转换器在其他情况下按预期工作。