我有一個功能區控制元件和選項卡標題的這種樣式。兩者都在 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));
}
}
為了確保該屬性回傳 True 我已經完成了:
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 設定另一種樣式?
uj5u.com熱心網友回復:
目前還不清楚DataContext你的RibbonTabHeader真正是什么,但這個系結應該作業假設PartRibbonMenuView是UserControlaPartViewModel作為它的 a DataContext:
<DataTrigger Binding="{Binding DataContext.SketchIsActive,
RelativeSource={RelativeSource AncestorType=UserControl}}" Value="True">
設定RelativeSource系結的屬性使您可以系結到可視樹中某個祖先型別的屬性。請參閱檔案以獲取更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430524.html
