首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确地将ContentTemplateSelector与ContentControl结合使用?

如何正确地将ContentTemplateSelector与ContentControl结合使用?
EN

Stack Overflow用户
提问于 2019-07-18 09:01:54
回答 1查看 133关注 0票数 0

我有很多ContentControl对象,我需要在其中的几个周围设置一个边框,而不是全部。我能够让它使用下面的代码:

代码语言:javascript
运行
复制
<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部分移动到其他资源文件中,并将它们合并。我添加了一个新的资源文件,并将下面的代码部分移到其中。

代码语言:javascript
运行
复制
<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的属性”

代码语言:javascript
运行
复制
<!-- 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>

如何解决此错误?

EN

回答 1

Stack Overflow用户

发布于 2019-07-18 10:18:12

不能将ControlTemplate类型的对象应用于期望类型为DataTemplateSelector的属性。

此错误消息非常明确。您正在将一个ControlTemplate分配给ContentControl.DataTemplateSelector。类型错配。你在分配

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

<ContentControl ContentTemplateSelector="{StaticResource BalanceAmountControls}">

解决方案:

您需要实现您自己的DataTemplateSelector

代码语言:javascript
运行
复制
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;
    }
}

应用模板选择器:

代码语言:javascript
运行
复制
<ContentControl ContentTemplateSelector="{StaticResource ContentControlDataTemplateSelector}" />

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57090784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档