c# - 如何正确使用 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>
如何解决此错误?
解决方案
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
属性的数据的各个视觉外观。
推荐阅读
- powershell - 使用 set-itemproperty 设置十进制值而不是十六进制
- c# - 如何将 ControlTemplate 内部的 ColorBrush 绑定到 ControlTemplate 外部的自定义属性?
- cross-compiling - ARM 64Bit 的交叉编译
- arrays - 如何在打字稿中将 JSON 转换为嵌套数组格式?
- android - android studio 4.2上的自定义按钮
- laravel - 在 laravel 中显示帖子
- python - 如何在不指定附件名称的情况下将邮件中的所有附件保存在 Outlook 中
- python - 查找最近定义的变量
- python - Python:以OO方式呈现的tkinter窗口
- python - 如何使用python替换excel中单元格中的多个值?