我试图为给定的Page
(WinUI 3 v1.2桌面项目)上的所有ToggleSwitche
的Header
创建一个简单的Style
。我真的想为我的所有绑定使用x:Bind
(而不是Binding
)。下面是我的Page.Resources
<Page.Resources>
<Style TargetType="ToggleSwitch" >
<Setter Property="FontSize" Value="{x:Bind app:App.ShellPage.RootShellFontSize, Mode=OneWay}" />
<Setter Property="Foreground" Value="{x:Bind app:App.ShellPage.UiColorContentAreaForeground, Mode=OneWay}" />
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate x:DataType="ToggleSwitch">
<TextBlock Text="{x:Bind Header}" Foreground="{x:Bind Foreground}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
ToggleSwitch定义为
<ToggleSwitch Grid.Row="1" Grid.Column="1" Header="Resize Elements"
OffContent="Don't Resize" OnContent="Resize Everything"
IsOn="{x:Bind app:App.ShellPage.IsSettingsResizeElements, Mode=TwoWay}" />
我认为这会将Header
TextBlock
中的文本设置为ToggleSwitch
Header
中的任何设置(此处为“调整元素大小”),并将Header
的Foreground
绑定到UiColorContentAreaForeground
。
第一个绑定在TextBlock
、Text="{x:Bind Header}"
、当绑定引擎在查看Header
属性之前尝试将字符串"Resize Elements"
转换为ToggleSwitch
时,总是引发错误。使用Text="{x:Bind}"
与Text="{x:Bind OnContent}"
或Text="{x:Bind OffContent}"
执行相同的操作(!?)。我想不出为什么后面两个会发生,因为ToString()
返回Header
的内容。TextBlock
中的第二个绑定与UiColorContentAreaForeground
绑定,但它的值与UiColorContentAreaForeground
不同(尽管它总是相同的错误值)。
你知道绑定有什么问题吗?我应该怎么用x:Bind写绑定呢?
顺便说一句,使用Text="{Binding}"
是可行的,但我还没有找到任何适用于Foreground
属性的绑定形式。
2条答案
按热度按时间4ngedf3f1#
TextBlock中的第一个绑定Text="{x:Bind Header}"总是引发错误,因为绑定引擎在查看Header属性之前尝试将字符串“Resize Elements”转换为ToggleSwitch。
这是预料之中的,因为您已经将样式所应用到的
ToggleSwitch
的Header
设置为此字符串值。HeaderTemplate
将应用到Header
。为了使您的样式正常工作,您应该将
ToggleSwitch
的Header
属性设置为另一个没有意义的ToggleSwitch
。您可以将
Header
设置为一个自定义对象,如下所示:XAML文件:
然后,您可以将
DataTemplate
的TargetType
变更为这个型别,并在样板中使用已编译的系结(x:Bind
):wmvff8tz2#
谢谢@mm8!你让我在
HeaderTemplate
应用于Header
。虽然这应该是显而易见的,但我一直被
DataTemplate
的文档卡住了,它说x:Bind
使用模板化对象作为它的根。我错误地解释了这一点,认为主对象上的所有DataTemplate
(在本例中为ToggleSwitch
)都将引用主对象。为了向那些同样面临代码挑战的人澄清一下,正如@mm8所指出的,
HeaderTemplate
(我想FooterTemplate
也是)实际上使用了赋给Header
的对象(Footer
),而ContentTemplate
将使用整个ToggleSwitch
。在本例中,我将
String
赋值给Header
,因此绑定(使用x:Bind
)的正确代码为TextBlock.Text
直接绑定到在ToggleSwitch
定义中分配给ToggleSwitch.Header
的字符串对象因为
String
没有Foreground
属性,所以我必须使用@mm8建议的方法,或者将x:Bind
直接用于Style
Foreground
Setter
中使用的相同Source
(我在上面的解决方案中展示了它)。再次感谢@mm8在我努力理解WinUI 3中XAML的细微差别时提供的帮助。