首页 > 解决方案 > 如何正确使用 ContentTemplateSelector 和 ContentControl?

问题描述

我有很多 ContentControl 对象,我需要围绕其中一些对象设置边框,而不是全部对象。我能够使用以下代码使其工作:

<ContentControl Margin="2" Grid.Row="0" Grid.Column="1" BorderThickness="5" BorderBrush="Beige">
    <!-- ContentControl.Template to get the border -->
    <ContentControl.Template>
        <ControlTemplate TargetType="ContentControl">
            <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" >
                <ContentPresenter
                        Content="{TemplateBinding Content}"
                        ContentTemplate="{TemplateBinding ContentTemplate}"
                        Cursor="{TemplateBinding Cursor}"
                        Margin="{TemplateBinding Padding}" />
            </Border>
        </ControlTemplate>
    </ContentControl.Template>
    <StackPanel>
        <Label Content="Paid" HorizontalAlignment="Right" />
        <Label Content="{Binding ReceivedAmount}" HorizontalAlignment="Right" />
    </StackPanel>
</ContentControl>

我想将整个 ContentTemplate 部分移动到其他资源文件并合并它们。我添加了一个新的资源文件并将下面的代码部分移到其中。

<ControlTemplate TargetType="ContentControl" x:Key="BalanceAmountControls">
    <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" >
        <ContentPresenter
                Content="{TemplateBinding Content}"
                ContentTemplate="{TemplateBinding ContentTemplate}"
                Cursor="{TemplateBinding Cursor}"
                Margin="{TemplateBinding Padding}" />
    </Border>
</ControlTemplate>

当我尝试将实际的 ContentControl 代码更改为此时,我收到一条错误消息

“System.Windows.Controls.ControlTemplate 类型的对象不能应用于需要 System.Windows.Controls.DataTemplateSelector 类型的属性”

<!-- Balance amount -->
<ContentControl Margin="2" Grid.Row="0" Grid.Column="2" BorderThickness="5" BorderBrush="Beige" ContentTemplateSelector="{StaticResource BalanceAmountControls}">
    <!-- ContentControl.Template to get the border -->
    <StackPanel>
        <Label Content="Balance" HorizontalAlignment="Right" />
        <Label Content="{Binding BalanceAmount}" HorizontalAlignment="Right" />
    </StackPanel>
</ContentControl>

如何解决此错误?

标签: c#wpfxaml

解决方案


ControlTemplate类型的对象不能应用于需要 DataTemplateSelector类型的属性

此错误消息非常明确。您正在将 a 分配ControlTemplate给 a ContentControl.DataTemplateSelector。类型不匹配。您正在分配

<ControlTemplate TargetType="ContentControl" x:Key="BalanceAmountControls">

<ContentControl ContentTemplateSelector="{StaticResource BalanceAmountControls}">.

解决方案:
您需要实现自己的 DataTemplateSelector

public class ContentControlDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate
        SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element != null && item != null && item is Task)
        {
            if (// your condition)
                return
                    element.FindResource("BalanceAmountControls") as  DataTemplate;
            else
                return
                    element.FindResource("NonBalanceAmountControls") as DataTemplate;
        }

        return null;
    }
}

应用模板选择器:

<ContentControl ContentTemplateSelector="{StaticResource ContentControlDataTemplateSelector}" />

现在您需要创建适当的DataTemplate资源来描述您必须绑定到ContentControl.Content属性的数据的各个视觉外观。


推荐阅读