如何根据 WPF 中控件的哈希码编写 DataTrigger
How to write a DataTrigger based on hashcode of a Control in WPF
我有一个属性HashCodeValue
。基于 HashCodeValue 中的 HashCode 属性 我需要使用 DataTrigger 更改控件的可见性。
WPFXAML源代码:
<Style TargetType="{x:Type DataGridColumnHeader}" x:Key="DummyFilterDataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Button Content="Super I" Visibility="Collapsed" />
<Button Content="Super II" Visibility="Collapsed" />
<Button Content="Super III" Visibility="Collapsed" />
<ControlTemplate.Triggers>
<DataTrigger Property="{Binding HashCodeValue}" Value="???">
<Setter TargetName="Button" Property="Visibility" Value="Visible" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我们无法在编译时知道HashCode,它仅在运行时生成。在三个按钮中,属性 在 运行 时保存任一按钮的 HashCode。根据这个值,我想把对应按钮的Visibility改成Visible
.
请帮助我如何为我的场景编写 DataTrigger。
您必须将哈希码值放在您绑定的DataTrigger
中的Value
中。
<Style TargetType="{x:Type DataGridColumnHeader}" x:Key="DummyFilterDataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<StackPanel Name="ButtonsPanel">
<Button Name="BtnSuper1" Content="Super I" Visibility="Collapsed">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</Button.Style>
</Button>
<Button Name="BtnSuper2" Content="Super II" Visibility="Collapsed">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</Button.Style>
</Button>
<Button Name="BtnSuper3" Content="Super III" Visibility="Collapsed" >
<Button.Style>
<Style TargetType="Button">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</Button.Style>
</Button>
</StackPanel>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding HashCodeValue}" Value="Give Your HashCode for matching ">
<Setter TargetName="BtnSuper1" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding HashCodeValue}" Value="Give Your HashCode for matching">
<Setter TargetName="BtnSuper2" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding HashCodeValue}" Value="Give Your HashCode for matching ">
<Setter TargetName="BtnSuper3" Property="Visibility" Value="Visible" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
由于 Hashcode 值仅在运行时已知,我认为您应该使用 IValueConverter 来实现您的目标。基本思想是你有散列作为转换器值,一些额外的字符串作为转换器参数,得到 bool 作为转换器输出。
因此,您的代码可能如下所示:
<ControlTemplate.Triggers>
<DataTrigger Property="{Binding HashCodeValue,Converter={StaticResource myConverter,ConverterParameter=myparameter}}" Value="true">
<Setter TargetName="Button" Property="Visibility" Value="Visible" />
</DataTrigger>
</ControlTemplate.Triggers>
如果我理解正确的话,这个技巧会满足你的需要。
我有一个属性HashCodeValue
。基于 HashCodeValue 中的 HashCode 属性 我需要使用 DataTrigger 更改控件的可见性。
WPFXAML源代码:
<Style TargetType="{x:Type DataGridColumnHeader}" x:Key="DummyFilterDataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Button Content="Super I" Visibility="Collapsed" />
<Button Content="Super II" Visibility="Collapsed" />
<Button Content="Super III" Visibility="Collapsed" />
<ControlTemplate.Triggers>
<DataTrigger Property="{Binding HashCodeValue}" Value="???">
<Setter TargetName="Button" Property="Visibility" Value="Visible" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我们无法在编译时知道HashCode,它仅在运行时生成。在三个按钮中,属性 在 运行 时保存任一按钮的 HashCode。根据这个值,我想把对应按钮的Visibility改成Visible
.
请帮助我如何为我的场景编写 DataTrigger。
您必须将哈希码值放在您绑定的DataTrigger
中的Value
中。
<Style TargetType="{x:Type DataGridColumnHeader}" x:Key="DummyFilterDataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<StackPanel Name="ButtonsPanel">
<Button Name="BtnSuper1" Content="Super I" Visibility="Collapsed">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</Button.Style>
</Button>
<Button Name="BtnSuper2" Content="Super II" Visibility="Collapsed">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</Button.Style>
</Button>
<Button Name="BtnSuper3" Content="Super III" Visibility="Collapsed" >
<Button.Style>
<Style TargetType="Button">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</Button.Style>
</Button>
</StackPanel>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding HashCodeValue}" Value="Give Your HashCode for matching ">
<Setter TargetName="BtnSuper1" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding HashCodeValue}" Value="Give Your HashCode for matching">
<Setter TargetName="BtnSuper2" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding HashCodeValue}" Value="Give Your HashCode for matching ">
<Setter TargetName="BtnSuper3" Property="Visibility" Value="Visible" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
由于 Hashcode 值仅在运行时已知,我认为您应该使用 IValueConverter 来实现您的目标。基本思想是你有散列作为转换器值,一些额外的字符串作为转换器参数,得到 bool 作为转换器输出。
因此,您的代码可能如下所示:
<ControlTemplate.Triggers>
<DataTrigger Property="{Binding HashCodeValue,Converter={StaticResource myConverter,ConverterParameter=myparameter}}" Value="true">
<Setter TargetName="Button" Property="Visibility" Value="Visible" />
</DataTrigger>
</ControlTemplate.Triggers>
如果我理解正确的话,这个技巧会满足你的需要。