WPF RibbonTabHeader DataTrigger 不适用于 ViewModel 属性

WPF RibbonTabHeader DataTrigger doesn´t work with ViewModel property

我有一个 Ribbon Control 和标签页眉的这种样式。两者都在 PartRibbonMenuView 中定义。

样式定义如下:

<Style TargetType="{x:Type RibbonTabHeader}" x:Key="RibbonTabHeader" BasedOn="{StaticResource {x:Type RibbonTabHeader}}">
    <Setter Property="Template">
        <Setter.Value>                    
            <ControlTemplate TargetType="RibbonTabHeader">
                <Border x:Name="TabHeader" BorderThickness="1,1,1,0" CornerRadius="6,6,0,0" Margin="1,0" BorderBrush="#FF707070">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,0"/>
                </Border>                        
                <ControlTemplate.Triggers>                            
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="TabHeader" Property="BorderThickness" Value="1,1,1,0" />
                        <Setter TargetName="TabHeader" Property="Background" Value="#3D26A0DA" />
                        <Setter TargetName="TabHeader" Property="BorderBrush" Value="#FF1A5AAB" />
                    </Trigger>
                    
                    <Trigger Property="IsRibbonTabSelected" Value="True">
                        <Setter TargetName="TabHeader" Property="BorderThickness" Value="2,2,2,0" />
                        <Setter TargetName="TabHeader" Property="Background" Value="WhiteSmoke" />
                        <Setter TargetName="TabHeader" Property="BorderBrush" Value="#FF1A5AAB" />
                    </Trigger>

                    <DataTrigger Binding="{Binding SketchIsActive}" Value="True">
                        <Setter TargetName="TabHeader" Property="BorderThickness" Value="1.5,1.5,1.5,0" />
                        <Setter TargetName="TabHeader" Property="Background" Value="red" />
                        <Setter TargetName="TabHeader" Property="BorderBrush" Value="Green" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我尝试过以两种方式使用该样式:

<Ribbon TabHeaderStyle="{StaticResource RibbonTabHeader}" IsSynchronizedWithCurrentItem="True" Background="WhiteSmoke"> ...<Ribbon/>

还有在打开 RibbonTab 时:

<RibbonTab Header="Sketch" TabIndex="1" HeaderStyle="{StaticResource RibbonTabHeader}"> ...<RibbonTab/>

以及 PartViewModel 的 属性

public bool SketchIsActive
{
    get { return sketchIsActive; }
    set
    {
        sketchIsActive = value;
        RaisePropertyChanged(nameof(SketchIsActive));
    }
}

为了确保 属性 returns 正确,我已经完成了:

public bool SketchIsActive
{
    get { return True; }
    set
    {
        sketchIsActive = value;
        RaisePropertyChanged(nameof(SketchIsActive));
    }
}

但还是不行。

最后执行PropertyChanged事件:

public void RaisePropertyChanged(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;

数据上下文设置为:

<Grid Grid.Row="0">
    <Grid.Resources>
        <DataTemplate DataType="{x:Type vms:HomeTabViewModel}">
            <views:HomeRibbonMenuView/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vms:PartViewModel}">
            <views:PartRibbonMenuView/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vms:AssemblyViewModel}">
            <views:AssemblyRibbonMenuView/>
        </DataTemplate>
    </Grid.Resources>

    <ContentControl Grid.Row="0" Content="{Binding CurrentViewModel}"/>
</Grid> 

这部分代码有自己的 ViewModel,称为“MainViewModel”。此 MainViewModel 有一个名为 CurrentViewModel 的 属性,用于导航。所以 PartRibbonMenuView 具有 PartViewModel 的 DataContext。

触发器的样式有效。但是,DataTrigger 不起作用。这是怎么回事?当我将 ViewModel 属性 设置为 True 时,如何为 RibbonTabHeader 使用另一种样式?

不清楚你的 RibbonTabHeaderDataContext 到底是什么,但假设 PartRibbonMenuView 是一个 UserControl 并且有一个 PartViewModel作为其 DataContext:

<DataTrigger Binding="{Binding DataContext.SketchIsActive,
    RelativeSource={RelativeSource AncestorType=UserControl}}" Value="True">

设置绑定的 RelativeSource 属性 可让您绑定到可视树中特定祖先类型的 属性。详情请参考docs