还有的时候,会遇到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/ 状态嵌套 ...
随机推荐
- VSCODE接入DeepSeek R1实现AI完成自动化脚本实战开发
大家好,我是六哥,今天还是我们喜爱的DeepSeek的玩法,今天来个实战案例,和大家分享一下如何将DeepSeek接入VS Code,结合AI Toolkit插件完成自动化脚本的实战开发. 一.准备 ...
- Nityacke's 分块(未补全)
P2801 教主的魔法 区间加区间查询一个数排名. 对于每个块,维护其有序序列.修改时散块暴力重构,整块打tag. 查询是简单的.时间复杂度 \(O(n\log B+\dfrac{qn}{B}\log ...
- C# Lambda || Linq 效率问题
255条数据 static void Main() { List<IPEndPoint> list = new List<IPEndPoint>(); for (int i = ...
- Typecho博客后台登陆界面美化
登录界面: 食用方法: 备份 admin 目录 压缩包内容上传到 admin 目录内. 结构:网站根目录 /admin/login.php 结构:网站根目录 /admin/style 修改 login ...
- php站点导入大mysql文件(linux系统)
问题描述:站点数据多,mysql导出后大于1G,使用phpmyadmin,导入一半报错,白白浪费等待时间,使用navicat 导入,执行时间过长提示错误 解决思路:1.拆分mysql文件,分批次导入, ...
- 记一次QT的QSS多个控件设置同一个样式的问题
文章目录 Qt样式表的格式问题 问题的引入 qss 选择器 问题所在 Reference Qt样式表的格式问题 问题的引入 最近在进行样式设计的时候,发现了一个问题,具体如下: 我是将所有样式写到.q ...
- SqlmapAPI:自动化SQL注入的利器
SqlmapAPI:自动化SQL注入的利器 SqlmapAPI简介 SqlmapAPI是基于sqlmap工具的API接口,它允许用户通过编程方式调用sqlmap的功能,实现自动化的SQL注入安全检测. ...
- HarmonyOS Next 鸿蒙开发-如何使用服务端下发的RSA公钥(字符串)对明文数据进行加密
如何使用服务端下发的RSA公钥(字符串)对明文数据进行加密 将服务器下发的RSA公钥字符串替换掉pubKeyStr即可实现,具体可参考如下代码: import { buffer, util } fro ...
- Golang 入门 : 符文
字符串常用语表示一系列文本字符,而Go的符文(rune)则用于表示单个字符. 字符串字面量由双引号(")包围,但rune字面量由单引号(')包围. Go程序几乎可以使用地球上任何语言的任何字 ...
- 基础指令:三剑客之sed、三剑客之awk详解
目录 4.9 三剑客之sed(查找.替换.删除.插入) 作用: 语法格式: 4.9.1 sed指定行输出 [行数]p 4.9.2 sed模糊搜索 /[字符串]/p 4.9.3 按照区间进行过滤查找 [ ...