是否可以在 XAML 中的 TemplateBinding 上使用转换器?

Posted

技术标签:

【中文标题】是否可以在 XAML 中的 TemplateBinding 上使用转换器?【英文标题】:Is it possible to use a converter on a TemplateBinding in XAML? 【发布时间】:2015-05-02 07:38:12 【问题描述】:

我正在构建一个按钮样式,它依赖于将颜色画笔转换为较深的阴影来创建阴影。在常规 XAML 中,我有一个转换器,而不是我在完美工作的绑定上使用的转换器:

BorderBrush="Binding Background, Converter=StaticResource ColourBrushToDarker"

但我无法让转换器在样式定义中使用 TemplateBinding。有办法吗? Visual Studio 只是不允许在 TemplateBinding 上使用转换器。

我尝试了以下方法,但没有成功:

Background="Binding Converter=StaticResource ColourBrushToDarker, ConverterParameter=Binding Path=Background"/>

(我已经尝试了上面的行,用 TemplateBinding 替换了 Binding 以及其他几个迭代)

这可以吗?我想到的另一件事是在 C# 中编写一个进行转换的属性,但样式没有代码隐藏文件。

我追求的结果是能够创建一个比背景属性更暗的阴影的新画笔,因此按钮始终具有比其主要背景颜色更暗的阴影。

【问题讨论】:

【参考方案1】:

经过一些(乏味的)试验和错误后,我找到了解决方案:

Background="Binding Background, RelativeSource=RelativeSource Mode=TemplatedParent, Converter=StaticResource ColourBrushToDarker"

我仍在学习 XAML 样式,但我认为这里发生的情况是,通过将相对源设置为模板父级,我能够像使用 TemplateBinding 一样使用 Binding。由于我使用的是 Binding(不是 TemplateBinding),因此我可以添加转换器并获得所需的结果。

【讨论】:

请注意,您可以将“Mode=”放在 RelativeSource 上,因为它是可选语法。即:### Background="Binding 背景,RelativeSource=RelativeSource TemplatedParent,Converter=StaticResource ColourBrushToDarker" ###

以上是关于是否可以在 XAML 中的 TemplateBinding 上使用转换器?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在ControlTemplate中包含Xaml资源?

是否可以在 XAML (Xamarin.Forms) 中混合 OnIdiom 和 OnPlatform?

XAML 中的分组列表视图

XAML 绑定到 CompositeCollection

从 XAML 中的 *.resx 文件中获取值

是否可以在 XAML 中绑定 Canvas 的 Children 属性?