单击数据网格列中的元素 Header
Click element within Data Grid Column Header
我已将自定义样式应用于 DataGrid 的列 headers。这是它的简化版本:
<Style x:Key="DataGridColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridColumnHeader">
<Grid>
<Border BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}">
<Grid>
<StackPanel Orientation="Horizontal">
<ContentPresenter Margin="5 0 5 0" HorizontalAlignment="Center" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
<Image IsHitTestVisible="True" Source="pin.png">
<Image.InputBindings>
<MouseBinding MouseAction="LeftClick" Command="{x:Static myView:MyCommand}" CommandParameter="{Binding}" />
</Image.InputBindings>
</Image>
</StackPanel>
</Grid>
</Border>
<Thumb x:Name="PART_LeftHeaderGripper" Style="{StaticResource DataGridColumnHeaderResizeThumb}"/>
<Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource DataGridColumnHeaderResizeThumb}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我很难让命令在单击图像时触发。有什么我想念的吗?单击 DataGridColumnHeader 中的元素(即图像)时,我可以通过其他方式触发命令吗?
更多细节:
MyCommand 在 Window 的 CommandBindings 中定义。我没有在此处包含此代码。我为其他可以正常工作的元素(即 DataGridCell)定义了类似的其他命令。似乎有一些特定于 DataGridColumnHeader 元素的方式阻止命令被触发。
您似乎绑定到 xmlns myView
下的类型 MyCommand
;相反,您应该绑定到 MyCommand
的实例(假设 class MyCommand
实现 ICommand
)。你可以考虑在这里实现单例。或者您可以在任何地方定义 MyCommand
的静态实例。
我已将自定义样式应用于 DataGrid 的列 headers。这是它的简化版本:
<Style x:Key="DataGridColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridColumnHeader">
<Grid>
<Border BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}">
<Grid>
<StackPanel Orientation="Horizontal">
<ContentPresenter Margin="5 0 5 0" HorizontalAlignment="Center" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
<Image IsHitTestVisible="True" Source="pin.png">
<Image.InputBindings>
<MouseBinding MouseAction="LeftClick" Command="{x:Static myView:MyCommand}" CommandParameter="{Binding}" />
</Image.InputBindings>
</Image>
</StackPanel>
</Grid>
</Border>
<Thumb x:Name="PART_LeftHeaderGripper" Style="{StaticResource DataGridColumnHeaderResizeThumb}"/>
<Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource DataGridColumnHeaderResizeThumb}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我很难让命令在单击图像时触发。有什么我想念的吗?单击 DataGridColumnHeader 中的元素(即图像)时,我可以通过其他方式触发命令吗?
更多细节: MyCommand 在 Window 的 CommandBindings 中定义。我没有在此处包含此代码。我为其他可以正常工作的元素(即 DataGridCell)定义了类似的其他命令。似乎有一些特定于 DataGridColumnHeader 元素的方式阻止命令被触发。
您似乎绑定到 xmlns myView
下的类型 MyCommand
;相反,您应该绑定到 MyCommand
的实例(假设 class MyCommand
实现 ICommand
)。你可以考虑在这里实现单例。或者您可以在任何地方定义 MyCommand
的静态实例。