还有的时候,会遇到DataGrid里面嵌套DataGrid(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案
与上一篇区别在于,详情里面的模板通常是通用的,被定义在样式文件中,被重复使用,因此无法为其添加后台代码,如果能添加后台代码,请翻阅第一篇;所以需要用到命令的方式来辅助事件的抛出,当然还可以利用第三方库Prism,他可以把事件当命令传递,且能传递事件的默认参数,详情请参阅这篇文章;好了,下面开始介绍,扩展DataGrid类,通过自定义命令抛出事件,并传递事件参数...
先请大致看下运行效果:

下面是详情代码,尾部有完整demo,下载
1 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
2 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3 xmlns:local="clr-namespace:CustomCommand">
4
5 <Style TargetType="DataGrid">
6 <Setter Property="IsReadOnly" Value="True" />
7 <Setter Property="CanUserAddRows" Value="False" />
8 <Setter Property="CanUserDeleteRows" Value="False" />
9 <Setter Property="VirtualizingPanel.ScrollUnit" Value="Pixel" />
10 </Style>
11
12 <!--为了不影响已设置的最基础样式,所以下面这个集成样式很重要-->
13 <Style TargetType="local:CustomDataGrid" BasedOn="{StaticResource {x:Type DataGrid}}" />
14
15 <DataTemplate x:Key="RowDetails">
16 <local:CustomDataGrid ItemsSource="{Binding Infos}"
17 MouseWheelCommand="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window},Path=MouseWheelCommand}" />
18 </DataTemplate>
19 </ResourceDictionary>
特别标注下,需要继承默认样式,否则应用到项目中,会区别出异样的
<!--为了不影响已设置的最基础样式,所以下面这个集成样式很重要-->
<Style TargetType="local:CustomDataGrid" BasedOn="{StaticResource {x:Type DataGrid}}" />
1 using Prism.Commands;
2 using System;
3 using System.Collections.Generic;
4 using System.Collections.ObjectModel;
5 using System.Linq;
6 using System.Text;
7 using System.Threading.Tasks;
8 using System.Windows;
9 using System.Windows.Controls;
10 using System.Windows.Data;
11 using System.Windows.Documents;
12 using System.Windows.Input;
13 using System.Windows.Media;
14 using System.Windows.Media.Imaging;
15 using System.Windows.Navigation;
16 using System.Windows.Shapes;
17
18 namespace CustomCommand
19 {
20 /// <summary>
21 /// MainWindow.xaml 的交互逻辑
22 /// </summary>
23 public partial class MainWindow : Window
24 {
25 /// <summary>
26 /// 鼠标滚动时发送
27 /// </summary>
28 public ICommand MouseWheelCommand { get; private set; }
29
30 public ObservableCollection<Info> Datas = new ObservableCollection<Info>();
31
32 public MainWindow()
33 {
34 MouseWheelCommand = new DelegateCommand<object>(CustomMouseWheel);
35
36 InitializeComponent();
37 datagrid.ItemsSource = Datas;
38
39 for (int i = 0; i < 50; i++)
40 {
41 var info = new Info();
42 info.name = "第一级" + i;
43 Datas.Add(info);
44
45 if (i % 2 == 0)
46 {
47 for (int j = 0; j < 20; j++)
48 {
49 info.Infos.Add(new Info()
50 {
51 name = "第二级" + j
52 });
53 }
54 }
55 }
56 }
57
58
59 /// <summary>
60 /// 当DataGrid的详情行里的DataGrid滚动时发生
61 /// </summary>
62 /// <param name="obj"></param>
63 void CustomMouseWheel(object p)
64 {
65 if (p is MouseWheelEventArgs e)
66 {
67 var sc = GetVisualChild<ScrollViewer>(datagrid);
68 if (sc != null)
69 {
70 sc.ScrollToVerticalOffset(sc.VerticalOffset - e.Delta);
71 }
72 }
73 }
74
75 T GetVisualChild<T>(Visual parent) where T : Visual
76 {
77 T child = default(T);
78 int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
79 for (int i = 0; i < numVisuals; i++)
80 {
81 var v = (Visual)VisualTreeHelper.GetChild(parent, i);
82 child = v as T ?? GetVisualChild<T>(v);
83 if (child != null)
84 break;
85 }
86 return child;
87 }
88 }
89
90 public class Info
91 {
92 public string name { get; set; }
93
94 public ObservableCollection<Info> Infos { get; set; } = new ObservableCollection<Info>();
95 }
96 }
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using System.Windows;
7 using System.Windows.Controls;
8 using System.Windows.Input;
9
10 namespace CustomCommand
11 {
12 /// <summary>
13 /// 自定义扩展DataGrid 主要是用于响应滚轮事件
14 /// </summary>
15 public class CustomDataGrid : DataGrid
16 {
17 public CustomDataGrid()
18 {
19 PreviewMouseWheel += CustomDataGrid_PreviewMouseWheel;
20 }
21
22 /// <summary>
23 /// 鼠标滚动滚动时
24 /// </summary>
25 /// <param name="sender"></param>
26 /// <param name="e"></param>
27 private void CustomDataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
28 {
29 MouseWheelCommand?.Execute(e);//触发命令,并把MouseWheelEventArgs传递
30 }
31
32 /// <summary>
33 /// 声明一个用于滚动通知的命令
34 /// </summary>
35 public ICommand MouseWheelCommand
36 {
37 get { return (ICommand)GetValue(MouseWheelCommandProperty); }
38 set { SetValue(MouseWheelCommandProperty, value); }
39 }
40
41 public static readonly DependencyProperty MouseWheelCommandProperty =
42 DependencyProperty.Register("MouseWheelCommand", typeof(ICommand), typeof(CustomDataGrid), new PropertyMetadata(default(ICommand)));
43
44 }
45 }
下面是完整demo,有需要的可以下载
还有的时候,会遇到DataGrid里面嵌套DataGrid(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案的更多相关文章
- mybatis的嵌套查询(嵌套查询nested select和嵌套结果nested results查询)区别
(转自:http://blog.csdn.net/canot/article/details/51485955) Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-man ...
- AJPFX实例集合嵌套之ArrayList嵌套ArrayList
案例:import java.util.ArrayList;import java.util.Iterator;import com.heima.bean.Person;public class De ...
- 代码实现集合嵌套之ArrayList嵌套ArrayList
package com.loaderman.list; import java.util.ArrayList; import com.loaderman.bean.Person; public cla ...
- Android ScrollView嵌套ViewPager,嵌套的ViewPager无法显示
记录:ScrollView嵌套ViewPager,嵌套的ViewPager无法显示 项目中所需要布局:LinearLayout中包含(orientation="vertical") ...
- easyui datagrid detailview嵌套datagrid的问题
解决问题办法来自 http://www.coding123.net/article/20141113/easyui-datagrid-datailview-use-sub-datagrid-not-a ...
- C# DataGrid嵌套DataGrid动态隐藏显示行
前端代码: <Window x:Class="DataGridPractice.MainWindow" xmlns="http://schemas.microsof ...
- EasyUI Datagrid Datetime(EasyUI DataGrid 时间格式化)
EasyUI DataGrid 时间格式化 方法一: var Common = { //EasyUI用DataGrid用日期格式化 TimeFormatter: function (value, re ...
- Flex4 中<s:Datagrid>、<mx:Datagrid>添加超链接的完整方法
<s:Datagrid>的添加超链接方法(链接文字会重叠) <s:GridColumn dataField="_fileName" headerText=&quo ...
- extJS4.2.0 Json数据解析,嵌套及非嵌套(二)
Ext.data.reader.Reader Readers通常用于翻译数据,使其被加载为 Model 实例或Store, 该数据一般是一个AJAX请求的响应数据. 一般情况下不需要直接创建一个Rea ...
- angularJs模块ui-router之状态嵌套和视图嵌套
原文地址:http://bubkoo.com/2014/01/01/angular/ui-router/guide/nested-states%20&%20nested-views/ 状态嵌套 ...
随机推荐
- Java02-基础语法
Java基础语法 [ 任务列表 ] 1.注释 2.字面量 3.变量 4.关键字.标识符 5.方法 6.类型转换 7.输入输出 8.运算符 9.其他 -------------------------- ...
- linux ubuntu更改软件源
更换步骤 sudo cp /etc/apt/sources.list /etc/apt/sources.list.back sudo vim /etc/apt/sources.list 替换为下面内容 ...
- 对外提供API,通过appId、appSecret、sign秘钥对接口做鉴权
一.背景 在接口开发过程中,我们通常不能暴露一个接口给第三方随便调用,要对第三方发来参数进行校验,看是不是具有访问权限. 名词介绍: 1.appId: 应用id,用户自定义命名,如:*-access- ...
- 在私有化部署的 Gitlab 实例中开启内置的容器镜像仓库
版本 极狐 GitLab v16.1.2-jh 步骤 如果使用 Let's Encrpt 集成,容器镜像仓库功能自动开启,访问地址为 your-gitlab-domain:5050. 否则,默认不开启 ...
- element-ui实现table表格的嵌套(table表格嵌套)功能实现
最近在做电商类型的官网,希望实现的布局如下:有表头和表身,所以我首先想到的就是table表格组件. 表格组件中常见的就是:标题和内容一一对应:像效果图中的效果,只用基础的表格布局是不行的,因此我想 ...
- sql server 新建用户数据库授权
必须对数据库进行 db_owner 授权.
- DeepSeek-R1的“思考”艺术,你真的了解吗?
大家好~,这里是AI粉嫩特攻队!今天咱们来聊聊一个有趣的话题--DeepSeek-R1到底什么时候会"思考",什么时候又会选择"偷懒"? 最近有朋友问我:&qu ...
- 高效开发助手:深入了解Hutool工具库
一.关于Hutool 1.1 简介 Hutool是一个功能丰富且易用的Java工具库,通过诸多实用工具类的使用,旨在帮助开发者快速.便捷地完成各类开发任务. 这些封装的工具涵盖了字符串.数字.集合. ...
- 实操Deepseek本地创建知识库
之前写了一篇本地电脑部署Deepseek的文章,有些朋友问到如何给本地的Deepseek添加知识库,于是我又找时间学习了下.现在把我的实操过程分享一下.这个是本地部署Deepseek的教程:https ...
- SpringCloud - [01] SpringCloud概述
题记部分 001 || 微服务概述 002 || 微服务技术栈 微服务条目 落地技术 服务开发 Spring.SpringMVC.SpringBoot 服务配置与管理 Netflix公司的Archai ...