【发布时间】:2011-01-19 20:48:17
【问题描述】:
我需要能够将 setter 的 Value 设置为附加属性,但在提出语法时遇到了困难。这是我的触发器的样子:
<DataTrigger Binding="{Binding Path=IsDisabled}" Value="True">
<Setter TargetName="LayoutRoot" Property="Opacity" Value="0.3" />
<Setter TargetName="LayoutRoot" Property="Background" Value="Interaction:Behaviors.OriginalBgBrush" />
</DataTrigger>
其中 Interaction:Behaviors.OriginalBgBrush 是在 LayoutRoot 上设置的附加属性,而 LayoutRoot 是一个边框。我必须这样做,因为在此之上的标准触发器设置了背景,但我无法同时检查模板和数据触发器的值。下面是整个模板,其中 MultiTrigger 是设置我不想要的背景的模板。背景颜色也以单独的样式定义,该样式使用此 ControlTemplate 作为其模板属性。
<ControlTemplate x:Key="StandardRowStyle" TargetType="tk:DataGridRow">
<Border x:Name="LayoutRoot" Margin="0,0,0,-1" MinHeight="23" Interaction:Behaviors.OriginalBgBrush="{TemplateBinding Background}" PreviewMouseRightButtonDown="DataGridRow_SimpleMouseDown" PreviewMouseLeftButtonDown="DataGridRow_SimpleMouseDown" Background="{TemplateBinding Background}" BorderBrush="{StaticResource ElementBorderBrush}" BorderThickness="1" CornerRadius="0" SnapsToDevicePixels="True">
<toolkit:SelectiveScrollingGrid x:Name="DGR_SelectiveScrollingGrid">
<toolkit:SelectiveScrollingGrid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</toolkit:SelectiveScrollingGrid.ColumnDefinitions>
<toolkit:SelectiveScrollingGrid.RowDefinitions>
<RowDefinition Height="*" MinHeight="23"/>
<RowDefinition Height="Auto"/>
</toolkit:SelectiveScrollingGrid.RowDefinitions>
<toolkit:DataGridCellsPresenter Grid.Column="1" Grid.Row="0" x:Name="DGR_CellsPresenter" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
<toolkit:DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" Visibility="{TemplateBinding DetailsVisibility}" toolkit:SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding Path=AreRowDetailsFrozen, Converter={x:Static tk:DataGrid.RowDetailsScrollingConverter}, ConverterParameter={x:Static tk:SelectiveScrollingOrientation.Vertical}, RelativeSource={RelativeSource AncestorType={x:Type tk:DataGrid}}}" />
<!--<toolkit:DataGridRowHeader Grid.Column="2" Grid.RowSpan="2" toolkit:SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding Path=HeadersVisibility, Converter={x:Static tk:DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static tk:DataGridHeadersVisibility.Row}, RelativeSource={RelativeSource AncestorType={x:Type tk:DataGrid}}}"/>-->
</toolkit:SelectiveScrollingGrid>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="IsSelected" Value="False" />
<Condition Property="DetailsVisibility" Value="Collapsed" />
</MultiTrigger.Conditions>
<Setter TargetName="LayoutRoot" Property="Background" Value="{StaticResource InactiveSelectedBackgroundBrush}" />
<Setter TargetName="LayoutRoot" Property="BorderBrush" Value="{StaticResource InactiveOuterBorderBrush}" />
<Setter TargetName="LayoutRoot" Property="CornerRadius" Value="5" />
</MultiTrigger>
<DataTrigger Binding="{Binding Path=IsDisabled}" Value="True">
<Setter TargetName="LayoutRoot" Property="Opacity" Value="0.3" />
<!-- Background needs to be changed back to default here -->
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
【问题讨论】:
-
Silverlight 中没有开箱即用的 DataTriggers 或 MultiTriggers,所以我认为这是 WPF。
标签: c# wpf data-binding