首页 > 其他分享 >WPF Prism,mvvm模式下,DataGrid中一列CheckBox的勾选的绑定

WPF Prism,mvvm模式下,DataGrid中一列CheckBox的勾选的绑定

时间:2024-02-02 16:14:04浏览次数:33  
标签:CheckBox mvvm get 绑定 DataGrid set public

背景

WPF+Prism,View和ViewModel,通过Binding来实现数据的更新和界面的刷新,我的需求是做一个表格,第一列为CheckBox,同时这一列的header也是CheckBox,勾选了header的CheckBox,可以实现所有行的CheckBox全选的功能
界面如下:
image

实现方法

xaml代码:

<DataGrid
    x:Name="dgRoundRobin"
    Grid.Row="2"
    Height="300"
    Margin="0,5,0,0"
    AutoGenerateColumns="False"
    BorderBrush="Black"
    BorderThickness="1"
    CanUserAddRows="{Binding DgRobinCanUserAddRows}"
    GridLinesVisibility="All"
    ItemsSource="{Binding DgRoundRobinItems}">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Binding="{Binding IsChecked}">
            <DataGridCheckBoxColumn.HeaderTemplate>
                <DataTemplate>
                    <CheckBox Command="{Binding DataContext.CbRoundRobinAllCheckCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
                </DataTemplate>
            </DataGridCheckBoxColumn.HeaderTemplate>
        </DataGridCheckBoxColumn>

        <DataGridTextColumn
            Width="150"
            Binding="{Binding MAC}"
            Header="MAC" />
        <DataGridTextColumn
            Width="100"
            Binding="{Binding SendCount}"
            Header="发送次数" />
        <DataGridTextColumn
            Width="100"
            Binding="{Binding RcvCount}"
            Header="接收次数" />
        <DataGridTextColumn
            Width="100"
            Binding="{Binding SuccessRate}"
            Header="成功率" />
        <DataGridTextColumn
            Width="100"
            Binding="{Binding Status}"
            Header="状态" />
    </DataGrid.Columns>
</DataGrid>

我感觉主要的难点就在xaml中的代码编写,这样的方法是创建了一个DataGridCheckBoxColumn,然后修改了它的HeaderTemplate,在其中进行了CheckBox的绑定,<CheckBox Command="{Binding DataContext.CbRoundRobinAllCheckCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
这一行是重点,我们用常规手段直接给header中的CheckBox绑定command是行不通的,因为WPF中没有DataGridCheckBoxColumn映射它(DataGridCheckBoxColumn不是控件,它没有父控件)
所以需要我们手动找到DataGrid元素,找到他身上的DataContext来绑定CbRoundRobinAllCheckCommand

ViewModel中的代码:
DataGrid的ItemSource绑定的DgRoundRobinItems,这个的定义如下:

private ObservableCollection<DgRoundRobinDeviceInfo> _dgRoundRobinItems = new ObservableCollection<DgRoundRobinDeviceInfo>();
public ObservableCollection<DgRoundRobinDeviceInfo> DgRoundRobinItems
{
    get { return _dgRoundRobinItems; }
    set { SetProperty(ref _dgRoundRobinItems, value); }
}

ObservableCollection实现了INotifyCollectionChangedINotifyPropertyChanged,所以这个集合中的Item有新增
或者删除的话,它会自动的调用UI进行更新,特别方便,以前我总是用List声明一个集合,但是当集合中的元素有新增或删除的时候,都得手动重新刷新下集合才行。
但是我还有个需求,就是想当集合中的Item的某个属性有变化的时候,也可以自动的刷新UI界面,不需要我自己来处理,后来发现还真的可以,只需要将Item的Class继承BindableBase(这是Prism提供的,Community.Mvvm.Toolkit应该是用的ObservableObject),这样子,就可以实现我的需求,代码如下:

public class DgRoundRobinDeviceInfo : BindableBase
{
    private bool _isChecked = false;
    public bool IsChecked
    {
        get { return _isChecked; }
        set { SetProperty(ref _isChecked, value); } 
    }

    public string MAC { get; set; }
    public int SendCount { get; set; }
    public int RcvCount { get; set; }
    public string SuccessRate { get; set; }
    public string Status { get; set; }
}

可以看到,我在DgRoundRobinDeviceInfo中的IsChecked属性上面实现了自动更新。

标签:CheckBox,mvvm,get,绑定,DataGrid,set,public
From: https://www.cnblogs.com/xavierxiu/p/18003297

相关文章

  • WPF 客户端设计(MVVM设计模式)
    WPF(WindowsPresentationFoundation)是微软推出的基于Windows的用户界面框架。在这里我设计了一份以MVVM设计模式下的纯桌面端应用架构,期间包含界面初始化流程,菜单加载及页面跳转流程等。以下来详细说明下设计方式:期间项目使用到了我自己上传到Nuget的包:目录1:启动2:主界面2.1......
  • d、CheckBox 复选框
    CheckBox多选按钮:classCheckboxPageextendsStatefulWidget{constCheckboxPage({super.key});@overrideState<CheckboxPage>createState()=>_CheckboxPageState();}class_CheckboxPageStateextendsState<CheckboxPage>{bool_flag=......
  • easyui-datagrid 加载数据 方法二 ( 自定义返回值 json方式)
    效果图 html部分<tableclass="my_table"><tr><tdclass='my_dt_label'>主叫号码:</td><tdclass='my_dt_field'><inputtype='text'id='select_callerid&......
  • easyui-datagrid 加载数据 方法一( 数据绑定方式 )
     效果图 html 部分<divstyle='padding:0px0px7px12px;'><tableclass="my_table"><tr><tdclass='my_dt_label'>姓名:</td><tdclass='......
  • html 自定义 checkbox样式
    input[type=checkbox]{appearance:none;-webkit-appearance:none;-moz-appearance:none;width:20px;height:20px;border:1pxsolid#ff6a00;background-color:white;line-height:20px;......
  • Prism:打造WPF项目的MVVM之选,简化开发流程、提高可维护性
     概述:探索WPF开发新境界,借助PrismMVVM库,实现模块化、可维护的项目。强大的命令系统、松耦合通信、内置导航,让您的开发更高效、更流畅在WPF开发中,一个优秀的MVVM库是Prism。以下是Prism的优点以及基本应用示例:优点:模块化设计: Prism支持模块化开发,使项目更易维护和扩展。......
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之CheckboxGroup组件
    鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之CheckboxGroup组件一、操作环境操作系统: Windows10专业版、IDE:DevEcoStudio3.1、SDK:HarmonyOS3.1+编辑二、CheckboxGroup组件提供多选框组件,通常用于某选项的打开或关闭。子组件无。接口CheckboxGroup(options?:{group?:string})创......
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Checkbox组件
    鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Checkbox组件一、操作环境操作系统: Windows10专业版、IDE:DevEcoStudio3.1、SDK:HarmonyOS3.1二、Checkbox组件提供多选框组件,通常用于某选项的打开或关闭。子组件无。接口Checkbox(options?:{name?:string,group?:string})参数参数......
  • 封装Excel读取,导出(实体类集合List、DataTable、DataGridView、实体类集合和DataTable
     1、引入使用 #region读取excel///<summary>///根据Excel和Sheet返回DataTable///</summary>///<paramname="filePath">Excel文件地址</param>///<paramname="sheetIndex">She......
  • 在WPF应用中实现DataGrid的分组显示,以及嵌套明细展示效果
    我在前面随笔《在Winform系统开发中,对表格列表中的内容进行分组展示》,介绍了Winform程序中对表格内容进行了分组的展示,在WPF应用中,同样也可以对表格的内容进行分组展示,不过处理方式和Winform有所差异,本篇随笔同样基于SqlSugar开发框架的基础上,实现在WPF应用中实现DataGrid的分组显......