继承数据模板并操纵背景颜色

时间:2017-06-15 20:19:25

标签: c# .net wpf datatemplate

我有以下datatemplate:

<DataTemplate
    x:Key="SourceControlCommitDataTemplate"
    DataType="{x:Type SourceControl:SourceControlCommitViewModel}">
    <Border
        BorderBrush="LightGray"
        BorderThickness="0 0 0 1"
        >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <TextBlock 
                Grid.Row="0"
                Grid.Column="0"
                Grid.ColumnSpan="3"
                Padding="0 5 0 0"
                Margin="3,0,0,0"
                TextTrimming="CharacterEllipsis"
                ToolTip="{Binding ToolTip}"
                Text="{Binding Message}"
                />
            <TextBlock
                Grid.Row="1"
                Grid.Column="0"
                Margin="3 0 0 0"
                Padding="0 0 0 3"
                Foreground="Gray"
                TextTrimming="CharacterEllipsis"
                ToolTip="{Binding ToolTip}"
                Text="{Binding Author}"
                />
            <TextBlock
                Grid.Row="1"
                Grid.Column="2"
                Margin="0 0 3 0"
                Padding="0 0 0 3"
                Foreground="Gray"
                HorizontalAlignment="Right"
                ToolTip="{Binding ToolTip}"
                Text="{Binding Date}"
                />
        </Grid>
    </Border>
</DataTemplate>

我使用此数据窗口获取我在列表框中显示的对象列表。 我想使用相同的datatemplate,只有一个我将背景颜色绑定到属性。所以我需要一个带颜色的列表框和一个简单的列表框。我可以重现整个代码并且可能使用datatemplate选择器(虽然不完全确定如何使用它们),但这看起来过于冗长和重复,是不是有一种简单的方法来重载整个模板中的属性或者那种效果呢? / p>

2 个答案:

答案 0 :(得分:0)

将模板原样用于不需要特殊颜色的模板。另一方面,请使用:

<DataTemplate
    x:Key="ColoredSourceControlCommitDataTemplate"
    DataType="{x:Type SourceControl:SourceControlCommitViewModel}"
    >
    <Border 
        Background="{Binding MyProperty, Converter={StaticResource SomeConverter}}"
        >
        <ContentControl
            Content="{Binding}"
            ContentTemplate="{StaticResource SourceControlCommitDataTemplate}"
            />
    </Border>
</DataTemplate>

或使用DataTemplate.Triggers代替转换器。

你可能需要摆弄HorizontalAlignment="Stretch"等等,但这是一般的想法。

答案 1 :(得分:0)

  

是否有一种简单的方法可以在整个模板中重载某个属性,或者为此产生什么?

不,DataTemplate始终定义为整体。您不能像使用Style那样将模板基于另一个模板。

但是您可以绑定到source属性并使用在找不到source属性时启动的FallbackValue,例如:

<Border Background="{Binding Background, FallbackValue=Transparent}"
    BorderBrush="LightGray"
    BorderThickness="0 0 0 1">
...