ContentPresenter TextElement 属性继承

Dan*_*Dan 5 .net wpf xaml wpf-controls

我有一个通用的 DataTemplate NameTemplate,我在其他 DataTemplate 中使用它。我故意未定义FontSizeFontFamily属性,以便使用 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>
Run Code Online (Sandbox Code Playgroud)

这是一个使用 DataTemplate 的示例;

<DataTemplate DataType="{x:Type common:Contact}">
    <StackPanel>
        <ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource NameTemplate}" Style="{StaticResource SubHeadingTextElementStyle}"/>
        <!-- Other Template Stuff -->
    </StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

样式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>
Run Code Online (Sandbox Code Playgroud)

为了使这项工作按预期进行,我必须将以下绑定添加到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>
Run Code Online (Sandbox Code Playgroud)

请注意与 TextElement 附加属性的 RelativeSource Self 绑定。

我在使用这种方法时遇到的另一个问题,在我的一个使用模板中,我将 TextElement.FontWeight 属性设置为与 BooleanToFontWeightConverter 的绑定——但此绑定不起作用——值转换器的 Convert 方法从未被调用。我认为这是由于我实施的解决方案,因为转换器在其他情况下按预期工作。