【问题标题】:How to write a DataTrigger based on hashcode of a Control in WPF如何根据 WPF 中控件的哈希码编写 DataTrigger
【发布时间】:2023-03-14 14:04:02
【问题描述】:

我有一个属性HashCodeValue。基于 HashCodeValue 属性中的 HashCode,我需要使用 DataTrigger 更改控件的可见性。

WPF XAML 源代码:

<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。

【问题讨论】:

    标签: c# wpf hashcode controltemplate datatrigger


    【解决方案1】:

    由于 Hashcode 值仅在运行时已知,我认为,您应该使用 IValueConverter 来达到您的目标。基本思想是您将哈希值作为转换器值,将一些附加字符串作为转换器参数,将布尔值作为转换器输出。

    因此,您的代码可能如下所示:

     <ControlTemplate.Triggers>
                        <DataTrigger Property="{Binding HashCodeValue,Converter={StaticResource myConverter,ConverterParameter=myparameter}}" Value="true">
                            <Setter TargetName="Button" Property="Visibility" Value="Visible" />
                        </DataTrigger>
                  </ControlTemplate.Triggers>
    

    如果我理解正确的话,这个技巧会给你你所需要的。

    【讨论】:

      【解决方案2】:

      您必须将 Hashcodevalue 放入您绑定的 Value 中的 DataTrigger 中。

       <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>
      

      【讨论】:

      • @J Hasan 我们无法知道编译时的 HashCode,它仅在运行时生成。在三个按钮中,该属性在运行时保存任何一个按钮哈希码。根据值,我想将可见性更改为可见。
      • 随着您的哈希码在运行时发生变化,这就是您使用绑定的原因。据我所知,在包含的情况下,datatrigger 需要在 Value 字段中设置与绑定值匹配的特定值,无论它是否相等。
      • 我已经稍微修改了我的代码,你可以试试这个。
      猜你喜欢
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      相关资源
      最近更新 更多