当前位置: 首页 > web >正文

C# DataGrid扩展 - DataGrid不同模板切换

目录

  • 前言
  • 一、需求描述
  • 二、解决步骤
    • 1.先将两个DataGrid设置成两个模板
    • 2.将上述模板通过样式判断显示
    • 3.使用Button控件控制DataGrid模板切换


前言

之前遇到一个需要使用两个按钮控制同一个DataGrid输出不同内容并表头也不一样,那如何处理呢?这篇是记录这一问题的处理方法。


一、需求描述

需求:需在同一界面上实现两个按钮控制同一个DataGrid输出的表头和内容都不相同。
需求处理解析:
1、可将DataGrid的不同表头放入两个模块写成样式
2、两个按钮的事件分别控制两个模块(点击则切换并生成内容)
优化:按钮按下后可让该按钮无法点击,防止重复点击并直观看到是哪个模板

二、解决步骤

1.先将两个DataGrid设置成两个模板

使用DataTemplate 定义,代码如下(示例):

<DataTemplate x:Key="DataGridTemplate"><DataGridd:ItemsSource="{d:SampleData ItemCount = 8}"RowHeaderWidth="60"AutoGenerateColumns="False"CanUserAddRows="False"HeadersVisibility="All"hc:DataGridAttach.CanUnselectAllWithBlankArea="True"hc:DataGridAttach.ShowRowNumber="True"VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling"ItemsSource="{Binding ElementName=self, Path=DataContext.TestDataList}"><DataGrid.Columns><DataGridTextColumn Binding="{Binding TestName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"ClipboardContentBinding="{x:Null}" Header="测试名称" /><DataGridTextColumn Binding="{Binding TestValue, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"ClipboardContentBinding="{x:Null}" Header="测试数值" /><DataGridTextColumn Binding="{Binding SpecialValue, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"ClipboardContentBinding="{x:Null}" Header="特殊数值" /></DataGrid.Columns></DataGrid>
</DataTemplate><DataTemplate x:Key="DataGrid1Template"><DataGridd:ItemsSource="{d:SampleData ItemCount = 8}"RowHeaderWidth="60"AutoGenerateColumns="False"CanUserAddRows="False"HeadersVisibility="All"hc:DataGridAttach.CanUnselectAllWithBlankArea="True"hc:DataGridAttach.ShowRowNumber="True"VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling"ItemsSource="{Binding ElementName=self, Path=DataContext.Test1DataList}"><DataGrid.Columns><DataGridTextColumn Binding="{Binding TestName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"ClipboardContentBinding="{x:Null}" Header="测试名称" /><DataGridTextColumn Binding="{Binding TestValue, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"ClipboardContentBinding="{x:Null}" Header="测试数值" /><DataGridTextColumn Binding="{Binding SpecialValue, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"ClipboardContentBinding="{x:Null}" Header="特殊数值" /><DataGridTextColumn Binding="{Binding SpecialValue1, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"ClipboardContentBinding="{x:Null}" Header="特殊数值1" /></DataGrid.Columns></DataGrid>
</DataTemplate>

2.将上述模板通过样式判断显示

可通过ContentControl控件,进行样式判断显示,代码如下(示例):

<ContentControl Grid.Row="2" Content="{Binding ElementName=self, Path=DataContext.Context}"><ContentControl.Style><Style TargetType="ContentControl"><Style.Triggers><DataTrigger Binding="{Binding ElementName=self, Path=DataContext.Context}" Value="测试1"><Setter Property="ContentTemplate" Value="{StaticResource DataGridTemplate}" /></DataTrigger><DataTrigger Binding="{Binding ElementName=self, Path=DataContext.Context}" Value="测试2"><Setter Property="ContentTemplate" Value="{StaticResource DataGrid1Template}" /></DataTrigger></Style.Triggers></Style></ContentControl.Style>
</ContentControl>

具体说明:
1、使用Context标签值,进行DataGridTemplate模板切换。
2、可使用Button控件控制Context标签值的变化。

3.使用Button控件控制DataGrid模板切换

1、xaml界面方面,使用ToggleButton(切换两种状态)按钮控件创建,代码如下:

<ItemsControl VerticalAlignment="Center" ItemsSource="{Binding TestButtons}" Margin="5"><ItemsControl.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel Orientation="Horizontal" /> </ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate><ToggleButton Width="100" Height="30"Command="{Binding ElementName=self, Path=DataContext.SelectedItem}"CommandParameter="{Binding Text}" Content="{Binding Context}" IsChecked="{Binding IsCheck}"Margin="0 0 10 0" Style="{DynamicResource ToggleButtonBaseStyle}" /></DataTemplate></ItemsControl.ItemTemplate>
</ItemsControl>

这样写的目的:能动态加载多个ToggleButton,也可以将其换为其他。

2、viewmodel方面,先定义按钮集TestButtons、标识Context、选中事件SelectedItem,代码如下:

private string _context;
public string Context
{get { return _context; }set { SetProperty(ref _context, value); }
}private ObservableCollection<TestButton> _testButtons;
public ObservableCollection<TestButton> TestButtons
{get { return _testButtons; }set { SetProperty(ref _testButtons, value); }
}private ICommand selectedItem;
public ICommand SelectedItem
{get{return selectedItem?? (selectedItem = new RelayCommand<object>(obj =>SelectedStatus(obj as string)));}
}

在构造函数中,让TestButtons添加多个button,并选中第一个按钮,代码如下:

//构造函数
public MainViewModel()
{TestButtons = new ObservableCollection<TestButton>();TestButtons.Add(new TestButton{Context = "测试1",IsCheck = true,Text = "测试1",CommandParameter = "Test1Data"});TestButtons.Add(new TestButton{Context = "测试2",IsCheck = false,Text = "测试2",CommandParameter = "Test2Data"});SelectedStatus("测试1");
}

选中函数实现,代码如下:

public void SelectedStatus(string text)
{foreach (var item in TestButtons){item.IsCheck = false;}Context = text;//选中text相同的第一个按钮var selectedBtn = TestButtons.Where(x => x.Text == text).First();selectedBtn.IsCheck = true;switch (text){case "测试1"://CreateTestDataList()换为真实数据TestDataList = CreateTestDataList();break;case "测试2":Test1DataList = CreateTestDataList();break;}
}

http://www.xdnf.cn/news/8555.html

相关文章:

  • 电商美图设计工具,图生生-低成本打造高转化商品场景图
  • 【新品来袭】功耗降低56%爱普生研发新款晶体振荡器
  • 信息系统项目管理师考前练习9
  • InnoDB引擎底层解析(二)之InnoDB的Buffer Pool(二)
  • 嵌入式STM32学习——ESP8266 01S的基础介绍
  • ConvSearch-R1: 让LLM适应检索器的偏好或缺陷
  • 【数据架构03】数据治理架构篇
  • 六、OpenGL 2.0 通过引入可编程着色器,将渲染控制权从硬件厂商转移到开发者手中。这是如何实现的,或者说可编程着色器是如何实现的
  • mybatis-plus与jsqlparser共用时报sql解析错误
  • Golang 之 Context 源码解析(1.20+)
  • 电动伺服疲劳试验机
  • Nodejs导出excel文件 及复杂样式解决方案
  • Spring用到的设计模式
  • 20200201工作笔记常用命令要整理
  • 根据Cortex-M3(STM32F1)权威指南讲解MCU内存架构与如何查看编译器生成的地址具体位置
  • 科研经验贴:AI领域的研究方向总结
  • TASK05【Datawhale 组队学习】系统评估与优化
  • @Configuration 与 @Component 的区别
  • IPSec VPN参数配置显示详解
  • Jenkins构建信息收集脚本详解:打造全面的CI/CD监控体系
  • 阿里云API RAG全流程实战:从模型调用到多模态应用的完整技术链路
  • 《C 语言内存函数超详细讲解:从 memcpy 到 memcmp 的原理与实战》
  • 计量芯片在小家电产品破壁机中的电机保护应用案例
  • react+Mapbox GL实现标记地点、区域的功能
  • python开发环境管理和包管理
  • SpringBoot3集成Oauth2.1——5资源地址配置
  • MySQL--day6--单行函数
  • 【HCIA】端口隔离
  • threadPool.submit() 和 threadPool.execute()的区别
  • nvidia Thor U与qualcomm 8295 DMPIS算力测试对比