这是第二中方法,可直接绑定,我这里只是做出了一种思路,并不是最完美。

这里注意一下,因为我里面引用了MVVMLight,所以可能代码不是复制过去就能用了的。

样式也是,所以复制过去看不是我贴出来的界面这也不奇怪。代码:

  1. <Grid>
  2. <Grid.ColumnDefinitions>
  3. <ColumnDefinition Width="*"/>
  4.  
  5. </Grid.ColumnDefinitions>
  6. <Grid.RowDefinitions>
  7. <RowDefinition Height="auto"></RowDefinition>
  8.  
  9. <RowDefinition Height="*"></RowDefinition>
  10. </Grid.RowDefinitions>
  11. <StackPanel Orientation="Horizontal">
  12. <Button Content="新增列" Command="{Binding AddColumnCmd}" Margin="5"/>
  13. <Button Content="删除列" Command="{Binding DeleteColumnCmd}" Margin="5"/>
  14. <Button Content="新增数据" Command="{Binding AddDataCmd}" Margin="5"/>
  15. </StackPanel>
  16. <!-- 自定义的DataGrid,使用到了一个依赖属性DataSource -->
  17. <Controls:DyDataGrid HeadersVisibility="All" RowHeaderWidth="60" Grid.Row="1" MinColumnWidth="10" DataSource="{Binding DyDGrid,Source={StaticResource Locator}}" SelectionUnit="CellOrRowHeader" SelectionMode="Extended"/>
  18.  
  19. </Grid>

自定义控件DyDataGrid,就添加一个依赖属性,赋值一个VM类DyDataGridViewModel,把DyDataGrid赋值给DyDataGridViewModel的DataGrid

  1. public class DyDataGrid : DataGrid
  2. {
  3. public DyDataGrid()
  4. : base()
  5. {
  6. AutoGenerateColumns = false;
  7. CanUserAddRows = false;
  8.  
  9. CanUserSortColumns = false;
  10. }
  11.  
  12. // 这个控件的一个自定义属性;
  13. private DyDataGridViewModel mDataSource;
  14. public DyDataGridViewModel DataSource
  15. {
  16. get { return mDataSource; }
  17. set
  18. {
  19. mDataSource = value;
  20. }
  21. }
  22.  
  23. /// <summary>
  24. /// 定义了一个名为DataSourc的控件依赖属性;
  25. /// 这个依赖属性用于显示peopoleDataGrid的内容;
  26. /// </summary>
  27. public static readonly DependencyProperty DataSourceProperty =
  28. DependencyProperty.Register("DataSource", typeof(DyDataGridViewModel), typeof(DyDataGrid),
  29. new FrameworkPropertyMetadata(new PropertyChangedCallback(OnDataSourcePeopertyChanged)));
  30.  
  31. private static void OnDataSourcePeopertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
  32. {
  33. DyDataGrid dyDataGrid = (DyDataGrid)obj;
  34.  
  35. if (args.NewValue is DyDataGridViewModel)
  36. {
  37. if (dyDataGrid != null)
  38. {
  39. DyDataGridViewModel peoplesViewModel = args.NewValue as DyDataGridViewModel;
  40. peoplesViewModel.DDataGrid = dyDataGrid;
  41.  
  42. }
  43. }
  44.  
  45. }
  1. /// <summary>
  2. /// DyDataGrid的数据源,自动新增列等功能
  3. /// </summary>
  4. public class DyDataGridViewModel : ViewModelBase
  5. {
  6. /// <summary>
  7. /// 绑定的数据
  8. /// </summary>
  9. ObservableCollection<ExpandoObject> _Items = new ObservableCollection<ExpandoObject>();
  10.  
  11. private DataGrid _DDataGrid;
  12. public DataGrid DDataGrid
  13. {
  14. get
  15. {
  16. return _DDataGrid;
  17. }
  18. set
  19. {
  20. if (_DDataGrid != null)
  21. {
  22. _DDataGrid.ItemsSource = null;
  23. }
  24. _DDataGrid = value;
  25. Init();
  26. }
  27. }
  28.  
  29. public ObservableCollection<ExpandoObject> Items
  30. {
  31. get { return _Items; }
  32. set
  33. {
  34. _Items = value;
  35. RaisePropertyChanged(() => Items);
  36. }
  37. }
  38.  
  39. #region 方法
  40. /// <summary>
  41. /// 初始化
  42. /// </summary>
  43. public void Init()
  44. {
  45. Items.Clear();
  46.  
  47. for (int i = ; i < ; i++)
  48. {
  49. dynamic item = new ExpandoObject();
  50. item.A = "Property A value - " + i.ToString();
  51. item.B = "Property B value - " + i.ToString();
  52. _Items.Add(item);
  53. }
  54.  
  55. DDataGrid.Columns.Add(new DataGridTextColumn() { Header = "A", Binding = new Binding("A") });
  56. DDataGrid.Columns.Add(new DataGridTextColumn() { Header = "B", Binding = new Binding("B") });
  57.  
  58. _DDataGrid.ItemsSource = Items;
  59. }
  60.  
  61. public void AddData()
  62. {
  63. //dynamic item = new ExpandoObject();
  64. //item.A = "New Item - A";
  65. //item.B = "New Item - B";
  66. //item.NewColumn1 = "New Item - C";
  67. //Items.Add(item);
  68. }
  69.  
  70. /// <summary>
  71. /// 添加列和列数据
  72. /// </summary>
  73. /// <param name="columnName">列名</param>
  74. /// <param name="columnName">显示列名</param>
  75. /// <param name="vs">填充的列数据</param>
  76. public void AddColumn(string columnName, string Header, List<string> vs)
  77. {
  78. int i = ;
  79. int count = vs.Count;
  80. //循环获取行数据
  81. foreach (IDictionary<String, Object> item in Items)
  82. {
  83. //每行添加新列数据
  84. item.Add(columnName, vs[i]);
  85. i++;
  86. //添加完数据跳出
  87. if (i >= vs.Count) break;
  88. }
  89.  
  90. //如果列数据多,则继续添加
  91. for (; i < vs.Count; i++)
  92. {
  93. //可以这么用 columnName就是传进来的列名
  94. dynamic item = new ExpandoObject();
  95. item.columnName = vs[i];
  96.  
  97. Items.Add(item);
  98. }
  99.  
  100. //添加列
  101. DDataGrid.Columns.Add(new DataGridTextColumn()
  102. {
  103. Header = Header,
  104. Binding = new Binding(columnName)
  105. });
  106.  
  107. }
  108. /// <summary>
  109. /// 删除选中列
  110. /// </summary>
  111. public void DeleteColumn()
  112. {
  113. for (int i = ; i < DDataGrid.SelectedCells.Count; i++)
  114. {
  115. //DataRowView Row = (DataRowView)DDataGrid.SelectedCells[i].Item;
  116. //string result = Row[DDataGrid.SelectedCells[i].Column.DisplayIndex].ToString();
  117.  
  118. //string result = DDataGrid.SelectedCells[i].Column.DisplayIndex.ToString();
  119.  
  120. DDataGrid.Columns.Remove(DDataGrid.SelectedCells[i].Column);
  121. }
  122. }
  123.  
  124. #endregion
  125. }
  1. public class W1ViewModel : ViewModelBase
  2. {
  3. /// <summary>
  4. /// Initializes a new instance of the MainViewModel class. DataGrid
  5. /// </summary>
  6. public W1ViewModel(DyDataGridViewModel dyDataGridViewModel)
  7. {
  8. DyDGrid = dyDataGridViewModel;
  9. }
  10.  
  11. public DyDataGridViewModel DyDGrid;
  12.  
  13. public RelayCommand AddColumnCmd => new Lazy<RelayCommand>(() =>
  14. new RelayCommand(AddColumn)).Value;
  15. public RelayCommand AddDataCmd => new Lazy<RelayCommand>(() =>
  16. new RelayCommand(AddData)).Value;
  17. public RelayCommand DeleteColumnCmd => new Lazy<RelayCommand>(() =>
  18. new RelayCommand(DeleteColumn)).Value;
  19.  
  20. private void AddData()
  21. {
  22. DyDGrid.AddData();
  23. }
  24. int newColumnIndex = ;
  25. private void AddColumn()
  26. {
  27. string cName = "C" + newColumnIndex;
  28. List<string> vs = new List<string>();
  29. for (int i = ; i < newColumnIndex; i++)
  30. {
  31. vs.Add("New Item - D" + i);
  32. }
  33. DyDGrid.AddColumn(cName, cName + "Show", vs);
  34. newColumnIndex++;
  35. }
  36.  
  37. private void DeleteColumn()
  38. {
  39. DyDGrid.DeleteColumn();
  40. }
  41. }

DyDataGridViewModel封装了对DataGrid的操作,同时也是DataGrid的数据源,可以使用绑定更新

效果如下:

链接: https://pan.baidu.com/s/1eDRHMUzvpQyTjnmqoscpKw 提取码: txs6

想了想,还是把整个代码发上来,哈哈,感觉你们应该喜欢。

Wpf DataGrid动态添加列,行数据(二)的更多相关文章

  1. Wpf DataGrid动态添加列,行数据(一)

    由于最近有这方面的需求,而且刚接触wpf不久,在网上找了很多方法,都不是使用MVVM模式的,因为DataGrid的列不能绑定 这就难受了,我想了个折中的方法,这个是使用了MVVMLight的消息机制, ...

  2. WPF Datagrid 动态生成列 并绑定数据

    原文:WPF Datagrid 动态生成列 并绑定数据 说的是这里 因为列头是动态加载的 (后台for循环 一会能看到代码) 数据来源于左侧列 左侧列数据源 当然num1 属于临时的dome使用  可 ...

  3. WPF datagrid 动态增加列

    DataGrid动态增加列 <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.m ...

  4. WPF DataGrid动态生成列的单元格背景色绑定

    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.DisplayInde ...

  5. asp.net gridview动态添加列,并获取其数据;

    1,绑定数据前先动态添加列,见方法CreateGridColumn(只在第一次加载动态添加): 2,gvlist_RowDataBound为对应列添加控件: 前台代码: <%@ Page Lan ...

  6. EasyUI datagrid动态生成列

    任务描述:根据用户选择时间段,生成列数据,如图

  7. C# DataGridView控件动态添加新行

    C# DataGridView控件动态添加新行 DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如 ...

  8. GridView动态添加列之后,导致PostBack(回发)页面数据丢失问题解决

    直入主题,首先声明,这个问题是无法解决的,特此在这说明 一.如何动态添加列,如下: 在页面重写OnInit事件,至于为什么要在这个事件写,根据页面的声明周期和经验可知(不用去别的地方找了,这个我找了之 ...

  9. C# DataGridView控件 动态添加新行

    DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行, ...

随机推荐

  1. java 多行注释

    public class Sample { public static void main(String[] args) { // java compiler ignores the comment ...

  2. 推荐一款移动端日历App吉日历

    推荐一款移动端日历App吉日历 一 应用描述 万年历.日历.农历.黄历.假期安排.天气预报.记事提醒便捷查看,一目了然! 二 功能介绍: 1.万年历:精美的日期展示,完整的节日日历随意查看,节假日.休 ...

  3. Feign的介绍和使用

    一.Feign的简介 Feign是一个声明式 WebService 客户端,使用Feign能够让编写Web Service 客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持J ...

  4. HTML连载29-div和span标签

    一.div标签 1.作用:一般用于配合CSS完成网页的基本布局 2.例子: <style> .head{ width: 980px; height: 100px; background: ...

  5. 在Mu-kittenbot中使用Robotbit固件

    首先,先下载安装支持robotbit扩展板的Mu: http://cdn.kittenbot.cn/mu/mu-kittenbot.exe 标准的3针插口,信号,正电,负电,可接市面的arduino模 ...

  6. SQL Server ---------- 分离数据库 生成 .mdf文件

    1.首先查看你要分离的数据库存储的位置 选中需要分离的数据数据库右击鼠标点击属性 要是记不住建议    复制一下 2.分离数据库      生成  .mdf 文件 右击 -----> 任务 -- ...

  7. 关于stm32f10x_conf.h文件

    简介 stm32f10x_conf.h文件有2个作用:①提供对assert_param运行时参数检查宏函数的定义.②将开发者用到的标准外设头文件集中在这个文件里面,而stm32f10x_conf.h又 ...

  8. Idea java 中导包路径分析

    工具类所在包: 查看工具类详情: 调用这个工具类时,导入的包路径为: 路径就是第1张图片中的包名utils+类名NumberUtils组成的utils.NumberUtils

  9. 《 .NET并发编程实战》阅读指南 - 第1章

    先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.

  10. WPF 精修篇 动态资源

    原文:WPF 精修篇 动态资源 动态资源 使用 DynamicResource 关键字 静态 就是 StaticResource 原则上是 能用静态就用静态 动态会让前台界面压力很大~ 动态资源引用 ...