You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于ViewModel属性启用/禁用Infragistics XamDataGrid表头复选框

如何基于ViewModel属性控制XamDataGrid表头全选复选框的启用状态

我来帮你解决这个XamDataGrid表头全选复选框的启用控制问题,刚好之前做过类似的需求,给你两种可行的方案:

方案一:自定义表头模板(直观易实现)

Infragistics默认的表头全选复选框没有直接暴露IsEnabled的绑定属性,所以我们可以直接给IsSelected列自定义一个表头模板,在模板里手动绑定复选框的启用状态到ViewModel的IsCheckboxHeaderEnabled属性,同时保留全选的原有逻辑。

修改你的FieldLayout代码,给IsSelected字段添加自定义HeaderTemplate:

<igDP:XamDataGrid x:Name="ItemSource" 
                  DataSource="{Binding ItemSource,Mode=TwoWay}" 
                  Grid.Row="0" 
                  Margin="10" 
                  AutoFit="true">
    <igDP:XamDataGrid.FieldLayouts>
        <igDP:FieldLayout>
            <!-- 其他字段 -->
            <igDP:Field Name="IsSelected">
                <igDP:Field.HeaderTemplate>
                    <DataTemplate>
                        <CheckBox x:Name="HeaderCheckBox" 
                                  Content="全选"
                                  <!-- 绑定全选状态到XamDataGrid的内置属性,和默认逻辑一致 -->
                                  IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type igDP:XamDataGrid}}, Path=FieldSettings.DataPresenter.AllRecordsSelected, Mode=TwoWay}"
                                  <!-- 绑定启用状态到ViewModel的IsCheckboxHeaderEnabled -->
                                  IsEnabled="{Binding DataContext.IsCheckboxHeaderEnabled, RelativeSource={RelativeSource AncestorType={x:Type igDP:XamDataGrid}}}" />
                    </DataTemplate>
                </igDP:Field.HeaderTemplate>
            </igDP:Field>
        </igDP:FieldLayout>
    </igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid>

这个方案的好处是逻辑清晰,你可以完全控制表头复选框的样式和行为,不需要额外的后台代码。

方案二:使用附加属性(保留默认样式)

如果你想保留Infragistics默认的表头样式,不想完全自定义模板,可以通过附加属性的方式,在表头模板加载后找到默认的复选框,再绑定它的IsEnabled属性。

第一步:创建附加属性类

在你的项目中添加一个静态类,实现附加属性的逻辑:

using System.Windows;
using System.Windows.Controls;
using Infragistics.Windows.DataPresenter;

public static class DataGridHeaderHelper
{
    public static readonly DependencyProperty IsHeaderCheckBoxEnabledProperty =
        DependencyProperty.RegisterAttached(
            "IsHeaderCheckBoxEnabled",
            typeof(bool),
            typeof(DataGridHeaderHelper),
            new PropertyMetadata(true, OnIsHeaderCheckBoxEnabledChanged));

    public static bool GetIsHeaderCheckBoxEnabled(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsHeaderCheckBoxEnabledProperty);
    }

    public static void SetIsHeaderCheckBoxEnabled(DependencyObject obj, bool value)
    {
        obj.SetValue(IsHeaderCheckBoxEnabledProperty, value);
    }

    private static void OnIsHeaderCheckBoxEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is Field field)
        {
            field.HeaderTemplateLoaded += Field_HeaderTemplateLoaded;
        }
    }

    private static void Field_HeaderTemplateLoaded(object sender, HeaderTemplateLoadedEventArgs e)
    {
        var field = sender as Field;
        if (field == null) return;

        // Infragistics默认的表头复选框名称是PART_HeaderCheckBox
        var checkBox = e.HeaderPresenter.ContentTemplateRoot.FindName("PART_HeaderCheckBox", e.HeaderPresenter) as CheckBox;
        if (checkBox != null)
        {
            // 将复选框的IsEnabled绑定到附加属性
            var binding = new Binding
            {
                Path = new PropertyPath("IsHeaderCheckBoxEnabled"),
                Source = field,
                Mode = BindingMode.OneWay
            };
            checkBox.SetBinding(CheckBox.IsEnabledProperty, binding);
        }

        // 取消订阅避免重复触发
        field.HeaderTemplateLoaded -= Field_HeaderTemplateLoaded;
    }
}

第二步:在XAML中使用附加属性

在你的XamDataGrid的IsSelected字段上添加这个附加属性,绑定到ViewModel的IsCheckboxHeaderEnabled:

<igDP:XamDataGrid x:Name="ItemSource" 
                  DataSource="{Binding ItemSource,Mode=TwoWay}" 
                  Grid.Row="0" 
                  Margin="10" 
                  AutoFit="true">
    <igDP:XamDataGrid.FieldLayouts>
        <igDP:FieldLayout>
            <!-- 其他字段 -->
            <igDP:Field Name="IsSelected"
                        local:DataGridHeaderHelper.IsHeaderCheckBoxEnabled="{Binding IsCheckboxHeaderEnabled}" />
        </igDP:FieldLayout>
    </igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid>

注意:记得在XAML的根元素上添加local命名空间,指向你定义DataGridHeaderHelper类的程序集,比如:

xmlns:local="clr-namespace:YourProjectNamespace"

这个方案的优势是不需要修改默认的表头样式,只是动态修改复选框的启用状态,适合想保留Infragistics原生视觉效果的场景。

内容的提问来源于stack exchange,提问作者WpfBee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:20:34