在WPF中使用图片或图标代替DataGridCheckBoxColumn

3

我想要在选中 DataGridColumn 中的 CheckBox 时将其更改为一张图片,而在未选中时则是另一张图片。我该怎么做呢? Ps:我的 DataGridCheckBoxColumn 定义如下:

 <DataGridCheckBoxColumn Header="Priority" Binding="{Binding PRIORITY, Converter={StaticResource converter}}"/>

转换器正在将字节转换为布尔值。

1个回答

6
使用 ElementStyleEditingElementStyle 属性来创建并设置不同的 Template,以适配 CheckBox。例如:
<DataGridCheckBoxColumn Binding="{Binding IsActive}">
    <DataGridCheckBoxColumn.ElementStyle>
        <Style TargetType="{x:Type CheckBox}">
            <Setter Property="IsEnabled" Value="False" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type CheckBox}">
                        <Image MaxWidth="32" MaxHeight="32">
                            <Image.Style>
                                <Style TargetType="{x:Type Image}">
                                    <Setter Property="Source" Value="Images/Error.ico" />
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsChecked, RelativeSource={RelativeSource AncestorType=CheckBox}}" Value="True">
                                            <Setter Property="Source" Value="Images/Default.ico" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Image.Style>
                        </Image>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGridCheckBoxColumn.ElementStyle>
</DataGridCheckBoxColumn>

这将使列显示一个基于IsChecked的图像,URI被硬编码,CheckBox被禁用,因为在ElementStyle中编辑不会改变绑定对象的任何属性。它的唯一目的是显示适当的图片。

(这里没有设置EditingElementStyle,所以如果用户再次点击单元格进行编辑,则会出现一个普通的CheckBox,可以选中或取消选中。)

Screencap


1
只是补充一下,如果您希望使用EditingElementStyle隐藏复选框,则与上面的代码相同,不需要这个<Setter Property="IsEnabled" Value="False" />。 - flux
问题在于,如果单元格之前没有被选中/聚焦,那么当勾选/取消勾选时图像不会改变。那么如何解决这个问题?有什么想法吗? - Willy
@user1624552:ElementStyle 应该可以正常工作,你是否设置了 EditingElementStyle - H.B.
@H.B. 是的,我这样做了。我在你的示例中放置了ElementStyle和EditingElementStyle(没有<Setter Property="IsEnabled" Value="False" />)。第一次单击复选框列时,复选框不会被选中/取消选中,需要第二次单击。一旦复选框列获得焦点,就没有问题了。 - Willy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接