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 使用另一种样式?
不清楚你的 RibbonTabHeader
的 DataContext
到底是什么,但假设 PartRibbonMenuView
是一个 UserControl
并且有一个 PartViewModel
作为其 DataContext
:
<DataTrigger Binding="{Binding DataContext.SketchIsActive,
RelativeSource={RelativeSource AncestorType=UserControl}}" Value="True">
设置绑定的 RelativeSource
属性 可让您绑定到可视树中特定祖先类型的 属性。详情请参考docs。
我有一个 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 使用另一种样式?
不清楚你的 RibbonTabHeader
的 DataContext
到底是什么,但假设 PartRibbonMenuView
是一个 UserControl
并且有一个 PartViewModel
作为其 DataContext
:
<DataTrigger Binding="{Binding DataContext.SketchIsActive,
RelativeSource={RelativeSource AncestorType=UserControl}}" Value="True">
设置绑定的 RelativeSource
属性 可让您绑定到可视树中特定祖先类型的 属性。详情请参考docs。