Wpf ResourceDictionary控件模板内的模板绑定

Wpf ResourceDictionary控件模板内的模板绑定,wpf,xaml,uwp,Wpf,Xaml,Uwp,我有一本资源字典如下: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:uwpControls="using:Microsoft.Toolkit.Uwp.UI.Controls" xmlns:controls="u

我有一本资源字典如下:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:uwpControls="using:Microsoft.Toolkit.Uwp.UI.Controls"
    xmlns:controls="using:Presentation.Common.Controls">
<Style x:Key="ExpanderStyleSection" TargetType="uwpControls:Expander">
        <Setter Property="HeaderStyle" Value="{StaticResource LightExpanderHeaderToggleButtonStyle}"/>
        <Setter Property="Margin" Value="4"/>
    </Style>
 <Style x:Key="LightExpanderHeaderToggleButtonStyle" TargetType="ToggleButton">
 <Setter Property="Template">
 <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Grid x:Name="RootGrid" 
                                  Background="{StaticResource BrushBeckmanAquaA1}"> <!-- I want to change the background from an other View based on some condition -->
</ControlTemplate>
</Style>
</ResourceDictionary>

现在,我在另一个视图中使用本词典中的样式,如下所示

<uwpControls:Expander x:Name="ExpanderLisSharedSettings" Grid.Row="0" Style="{StaticResource ExpanderStyleSection}">
<!--Some Content here-->
</uwpControls:Expander


您可以创建包含SolidColorBrush属性的ViewModel,并将其与RootGrid的背景绑定,并且需要在使用此样式的页面中声明DataContext。在这种情况下,它适用于绑定

如果要在ResourceDictionary中使用x:bind,则需要为其创建代码隐藏类。由于x:Bind依赖于代码生成,因此它需要一个代码隐藏文件,其中包含调用InitializeComponent的构造函数(以初始化生成的代码)

这里我们以绑定为例

Page.xaml:

<ToggleButton Style="{StaticResource LightExpanderHeaderToggleButtonStyle}"></ToggleButton>
ResourceDictionary.xaml:

<Style x:Key="LightExpanderHeaderToggleButtonStyle" TargetType="ToggleButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <Grid x:Name="RootGrid" Background="{Binding MyColor}">
                    <TextBlock Text="{Binding Fname}"></TextBlock>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

您可以创建包含SolidColorBrush属性的ViewModel,并将其与RootGrid的背景绑定,并且需要在使用此样式的页面中声明DataContext。在这种情况下,它适用于绑定

如果要在ResourceDictionary中使用x:bind,则需要为其创建代码隐藏类。由于x:Bind依赖于代码生成,因此它需要一个代码隐藏文件,其中包含调用InitializeComponent的构造函数(以初始化生成的代码)

这里我们以绑定为例

Page.xaml:

<ToggleButton Style="{StaticResource LightExpanderHeaderToggleButtonStyle}"></ToggleButton>
ResourceDictionary.xaml:

<Style x:Key="LightExpanderHeaderToggleButtonStyle" TargetType="ToggleButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <Grid x:Name="RootGrid" Background="{Binding MyColor}">
                    <TextBlock Text="{Binding Fname}"></TextBlock>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

在模板中使用
TemplateBinding
。您可以使用
定义默认值:

<Style x:Key="LightExpanderHeaderToggleButtonStyle" TargetType="ToggleButton">
    <Setter Property="Background" Value="{StaticResource BrushBeckmanAquaA1}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
                    ...
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
例如,如果视图模型定义了一个名为“TheBackground”的
Brush
属性,则可以像往常一样绑定到它(只有UWP支持
{x:bind}
):


在模板中使用
模板绑定。您可以使用
定义默认值:

<Style x:Key="LightExpanderHeaderToggleButtonStyle" TargetType="ToggleButton">
    <Setter Property="Background" Value="{StaticResource BrushBeckmanAquaA1}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
                    ...
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
例如,如果视图模型定义了一个名为“TheBackground”的
Brush
属性,则可以像往常一样绑定到它(只有UWP支持
{x:bind}
):



仅当视图模型具有名为“MyColor”的属性或模板中使用的任何硬编码路径时,此解决方案才有效。您应该绑定到控件的依赖项属性。此解决方案仅在视图模型具有名为“MyColor”的属性或模板中使用的任何硬编码路径时有效。您应该绑定到控件的依赖项属性。
<uwpControls:Expander x:Name="ExpanderLisSharedSettings" Grid.Row="0" 
                      Background="{Binding TheBackground}" />