如何在 WPF XAML 中将控件的哈希代码作为命令参数传递

本文关键字:代码 哈希 参数传递 命令 控件 WPF XAML | 更新日期: 2023-09-27 18:33:18

我有一个DataGridColumnHeader Sytle,因为我有一个用于过滤的按钮。我需要将按钮哈希代码作为命令参数传递

<Style TargetType="{x:Type DataGridColumnHeader}" x:Key="DummyFilterDataGridColumnHeader">
   <Setter Property="Template">
      <Setter.Value>
          <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
              <Button Command="{Binding Path=DataContext.FilterPopUpCommand, 
                                  RelativeSource={RelativeSource Mode=FindAncestor, 
                                                  AncestorType={x:Type Window}}}">
                  <Button.CommandParameter>
                      <MultiBinding Converter="{StaticResource MultiValueConverterKey}">
                          <Binding RelativeSource="{ RelativeSource Mode=FindAncestor, 
                                                     AncestorType={x:Type cust:DataGrid}}" />
                          <Binding Path="Column" 
                                   RelativeSource="{RelativeSource Mode=TemplatedParent}" />
                          <Binding Path="HashCode"  />
                      </MultiBinding>
                  </Button.CommandParameter>
              </Button>
          </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>

注意:我的要求是仅从 XAML 传递哈希代码,而不是在 从按钮控件中提取 C#。

如何在 WPF XAML 中将控件的哈希代码作为命令参数传递

由于获取Button HashCode的唯一方法是通过GetHashCode()方法,因此我建议您像这样将按钮本身的引用传递给命令:

<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                    <Button x:Name="Btn" Command="{Binding Path=DataContext.FilterPopUpCommand, 
                              RelativeSource={RelativeSource Mode=FindAncestor, 
                                              AncestorType={x:Type Window}}}">
                        <Button.CommandParameter>
                            <MultiBinding Converter="{StaticResource MultiValueConverterKey}">
                                <Binding RelativeSource="{ RelativeSource Mode=FindAncestor, 
                                                 AncestorType={x:Type cust:DataGrid}}" />
                                <Binding Path="Column" 
                               RelativeSource="{RelativeSource Mode=TemplatedParent}" />
                                <Binding ElementName="Btn" />
                            </MultiBinding>
                        </Button.CommandParameter>
                    </Button>
                </ControlTemplate>

MultivalueConverter 中,提取哈希代码并将其传递给命令:

 public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values==null)            
            return null;
        var hashCode = (values[2] as Button).GetHashCode();
       //the rest of your code 
    }