ContentPresenter TextElement属性继承

时间:2014-05-09 21:06:52

标签: .net wpf xaml wpf-controls

我有一个常见的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方法是从未打电话过我认为这是由于我已经实现的解决方案,因为转换器在其他情况下按预期工作。

0 个答案:

没有答案