找回密码
 立即注册

QQ登录

只需一步,快速开始

来爱清
论坛元老   /  发表于:2014-10-17 16:56  /   查看:9098  /  回复:7
您好,
在C1DataGrid的设置了SelectionMode="MultiRow",目前同时选择多行需要通过键盘的ctrl键才能达到这个目标,但我希望的是在行任意地方仅仅通过鼠标单击选择多个行,并且多行被选中的蓝色背景样式也显示出来(如下图),在MVVM模式里如何实现呢?谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

7 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2014-10-17 17:45:00
沙发
回复 1楼来爱清的帖子

根据你的描述,你的需求是不使用Ctrl键实现鼠标的多选行。
这个需要自己写代码完成。
我这里有一个Silverlight下用C1DataGrid实现鼠标多选行的Demo,和WPF下你的需求类似。
你可以先看看。如果我有什么理解不对的地方,还望指出。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
来爱清
论坛元老   /  发表于:2014-10-20 17:25:00
板凳
回复 2楼Alice的帖子

谢谢Alice分享Demo,代码已经看过了,有个问题,在MVVM模式里如何将选中的列表行里动态高亮起来,是不是只能调用C1DataGrid控件对象来动态设置高亮的?
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-10-20 18:43:00
地板
回复 3楼来爱清的帖子

鼠标选择的时候,默认是高亮。很抱歉我不太理解你是需要对高亮的颜色做更改么?
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
来爱清
论坛元老   /  发表于:2014-10-21 11:04:00
5#
回复 4楼Alice的帖子


  1.         C1.Silverlight.DataGrid.DataGridRow row;
  2.         //List to keep track of current selection
  3.         List<C1.Silverlight.DataGrid.DataGridRow> selectedRows;

  4.         void Presenter_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  5.         {
  6.             selectedRows = this.c1DataGrid1.Selection.SelectedRows.ToList();
  7.         }

  8.         void Presenter_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  9.         {
  10.             row = ((C1.Silverlight.DataGrid.DataGridRowPresenter)sender).Row;

  11.             /* If CTRL key has been pressed the entire code is not needed anyways.
  12.              * With SelectionMode set to MultiRow the grid will take care of
  13.              * addition/removal of rows from selection*/
  14.             if ((!C1.Silverlight.KeyboardUtil.Ctrl))
  15.             {
  16.                 Dispatcher.BeginInvoke(() =>
  17.                 {
  18.                     if (selectedRows.Contains(row))
  19.                     {
  20.                         selectedRows.Remove(row);
  21.                     }
  22.                     else
  23.                     {
  24.                         selectedRows.Add(row);
  25.                     }

  26.                     //Clear selection before we impose a new one
  27.                     c1DataGrid1.Selection.Clear();
  28.                     foreach (var r in selectedRows)
  29.                     {
  30.                         this.c1DataGrid1.Selection.Add(r, r);      
  31.                      }
  32.                 });
  33.             }
  34.         }
复制代码


不是指高亮颜色的设置,是指在不用Ctrl键时鼠标点击多个行时,被点击的多个行这时要处于行选中的高亮效果,之前您提过要通过代码才能实现这效果,上面关键代码是c1DataGrid1.Selection,只要把选中的多个行加入到这个Selection集合里,那么多个选中的行的高亮效果是自然会显示出来

上面的效果是要通过c1DataGrid1控件设置,在MVVM模式里基本上不直接访问控件来处理特定事情,我这里想问的是,在ViewModel里有没有不直接通过使用控件c1DataGrid1.Selection这方式的其它方案来达到上面所说的效果
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-10-21 12:28:00
6#
回复 5楼来爱清的帖子

Selection的这个高亮颜色是由内部控制的,当鼠标点击的时候默认就会改变背景色,不选中又会自动的清掉这个颜色。
所以采用了将选到的行添加到一个list,并设置给Selection,这样被选行会自动的高亮。
或许可以自己写代码实现。绑定Convert,设置被选行的背景色。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
来爱清
论坛元老   /  发表于:2014-10-21 14:11:00
7#
回复 6楼Alice的帖子

请问绑定Convert这个是什么样的,能否举个代码例子
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-10-21 16:57:00
8#
回复 7楼来爱清的帖子

由于没有现成的示例,所以自己写了代码并进行了测试,在这里花费了时间。
目前的研究进展是这样的,和Demo中的类似,自己操控了一个SelectedRows的List,当选择发生改变的时候,去判断是需要往这个List里添加还是删除行,并且将行的背景色进行更改。
1.初始化部分代码:
  1.   List<C1.WPF.DataGrid.DataGridRow> selectedRows;
  2.        public MainView()
  3.         {
  4.             InitializeComponent();
  5.             selectedRows = new List<C1.WPF.DataGrid.DataGridRow>();
  6.          
  7.             this.c1DataGrid1.SelectedBackground = new SolidColorBrush(Colors.Transparent);
  8.             this.c1DataGrid1.SelectionMode = C1.WPF.DataGrid.DataGridSelectionMode.MultiRow;
  9.             this.c1DataGrid1.SelectionChanged += new EventHandler<C1.WPF.DataGrid.DataGridSelectionChangedEventArgs>(c1DataGrid1_SelectionChanged);
  10.         }
复制代码

2.更改颜色的代码:
  1.   void c1DataGrid1_SelectionChanged(object sender, C1.WPF.DataGrid.DataGridSelectionChangedEventArgs e)
  2.         {
  3.             C1.WPF.DataGrid.DataGridRow r=  e.AddedRanges.Rows[0];
  4.             if (selectedRows.Count == 0)
  5.             {
  6.                 r.Presenter.Background = new SolidColorBrush(Colors.BlueViolet);
  7.                 selectedRows.Add(r);
  8.             }
  9.             else
  10.             {
  11.                 if (selectedRows.Contains(e.AddedRanges.Rows[0]))
  12.                 {
  13.                     r.Presenter.Background = null;
  14.                     selectedRows.Remove(r);
  15.                 }
  16.                 else
  17.                 {
  18.                     r.Presenter.Background = new SolidColorBrush(Colors.BlueViolet);
  19.                     selectedRows.Add(r);
  20.                 }              
  21.             }         
  22.             
  23.         }
复制代码


因为你不想操作C1DataGrid,所以在更改颜色的时候不会对C1DataGrid的Selection做变化,仅仅是操控我们自己设置的List并且对List的行进行颜色更改。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部