问题描述
如何在同一个元素和属性上使用多个数据触发器?
How can I have multiple data triggers work on the same element and property?
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding ElementName=RootGrid,Path=IsMouseOver}" Value="True">
<Setter TargetName="SelectionGrid" Property="Opacity" Value="0.5" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=RootGrid,Path=IsMouseOver}" Value="False">
<Setter TargetName="SelectionGrid" Property="Opacity" Value="0.0" />
</DataTrigger>
<DataTrigger Binding="{Binding Selected}" Value="True">
<Setter TargetName="SelectionGrid" Property="Opacity" Value="1.0" />
</DataTrigger>
<DataTrigger Binding="{Binding Selected}" Value="False">
<Setter TargetName="SelectionGrid" Property="Opacity" Value="0" />
</DataTrigger>
</DataTemplate.Triggers>
注意我如何定位 SelectionGrid
'的不透明度
属性。我怎样才能达到这种效果?这应该复制Windows 7具有的悬停选择框。因此,当两者都被 Selected
和 IsMouseOver
选中时,我希望向我展示 Selected
状态。
Notice how I'm targeting SelectionGrid
's Opacity
property. How can I achieve this effect? This is supposed to replicate the hover selection box that Windows 7 has. So when it both is Selected
and IsMouseOver
, I would like it to show me the Selected
state.
推荐答案
您可以使用 MultiDataTrigger
或具有 MultiBinding
和BooleanOrConverter的 DataTrigger
。
You could use MultiDataTrigger
or a DataTrigger
with a MultiBinding
and a BooleanOrConverter.
但是我认为解决您问题的最简单方法是对 Opacity
使用 MultiBinding
code>已选择和 IsMouseOver
But I think the easiest solution to your problem is to use a MultiBinding
for Opacity
where you bind to both Selected
and IsMouseOver
<DataTemplate>
<Grid x:Name="SelectionGrid">
<Grid.Opacity>
<MultiBinding Converter="{StaticResource OpacityConverter}">
<Binding RelativeSource="{RelativeSource Self}" Path="IsMouseOver"/>
<Binding Path="Selected"/>
</MultiBinding>
</Grid.Opacity>
</Grid>
<!-- ... -->
</DataTemplate>
然后在OpacityConverter中确定 Opacity
值
And in the OpacityConverter you decide the Opacity
value
public class OpacityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool isMouseOver = (bool)values[0];
bool selected = (bool)values[1];
if (selected == true)
{
return 1.0;
}
else if (isMouseOver == true)
{
return 0.5;
}
return 0.0;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
编辑: DataTrigger
和 MultiDataTrigger
<DataTemplate>
<Grid x:Name="SelectionGrid"
Opacity="0"
Background="Blue">
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Selected}" Value="True">
<Setter TargetName="SelectionGrid" Property="Opacity" Value="1.0"/>
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=SelectionGrid, Path=IsMouseOver}" Value="True"/>
<Condition Binding="{Binding Path=Selected}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter TargetName="SelectionGrid" Property="Opacity" Value="0.5"/>
</MultiDataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
这篇关于DataTemplate多个数据触发器具有相同的元素和属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!