Wpf DataGrid动态添加列,行数据(二)
这是第二中方法,可直接绑定,我这里只是做出了一种思路,并不是最完美。
这里注意一下,因为我里面引用了MVVMLight,所以可能代码不是复制过去就能用了的。
样式也是,所以复制过去看不是我贴出来的界面这也不奇怪。代码:
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <Grid.RowDefinitions>
- <RowDefinition Height="auto"></RowDefinition>
- <RowDefinition Height="*"></RowDefinition>
- </Grid.RowDefinitions>
- <StackPanel Orientation="Horizontal">
- <Button Content="新增列" Command="{Binding AddColumnCmd}" Margin="5"/>
- <Button Content="删除列" Command="{Binding DeleteColumnCmd}" Margin="5"/>
- <Button Content="新增数据" Command="{Binding AddDataCmd}" Margin="5"/>
- </StackPanel>
- <!-- 自定义的DataGrid,使用到了一个依赖属性DataSource -->
- <Controls:DyDataGrid HeadersVisibility="All" RowHeaderWidth="60" Grid.Row="1" MinColumnWidth="10" DataSource="{Binding DyDGrid,Source={StaticResource Locator}}" SelectionUnit="CellOrRowHeader" SelectionMode="Extended"/>
- </Grid>
自定义控件DyDataGrid,就添加一个依赖属性,赋值一个VM类DyDataGridViewModel,把DyDataGrid赋值给DyDataGridViewModel的DataGrid
- public class DyDataGrid : DataGrid
- {
- public DyDataGrid()
- : base()
- {
- AutoGenerateColumns = false;
- CanUserAddRows = false;
- CanUserSortColumns = false;
- }
- // 这个控件的一个自定义属性;
- private DyDataGridViewModel mDataSource;
- public DyDataGridViewModel DataSource
- {
- get { return mDataSource; }
- set
- {
- mDataSource = value;
- }
- }
- /// <summary>
- /// 定义了一个名为DataSourc的控件依赖属性;
- /// 这个依赖属性用于显示peopoleDataGrid的内容;
- /// </summary>
- public static readonly DependencyProperty DataSourceProperty =
- DependencyProperty.Register("DataSource", typeof(DyDataGridViewModel), typeof(DyDataGrid),
- new FrameworkPropertyMetadata(new PropertyChangedCallback(OnDataSourcePeopertyChanged)));
- private static void OnDataSourcePeopertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
- {
- DyDataGrid dyDataGrid = (DyDataGrid)obj;
- if (args.NewValue is DyDataGridViewModel)
- {
- if (dyDataGrid != null)
- {
- DyDataGridViewModel peoplesViewModel = args.NewValue as DyDataGridViewModel;
- peoplesViewModel.DDataGrid = dyDataGrid;
- }
- }
- }
- /// <summary>
- /// DyDataGrid的数据源,自动新增列等功能
- /// </summary>
- public class DyDataGridViewModel : ViewModelBase
- {
- /// <summary>
- /// 绑定的数据
- /// </summary>
- ObservableCollection<ExpandoObject> _Items = new ObservableCollection<ExpandoObject>();
- private DataGrid _DDataGrid;
- public DataGrid DDataGrid
- {
- get
- {
- return _DDataGrid;
- }
- set
- {
- if (_DDataGrid != null)
- {
- _DDataGrid.ItemsSource = null;
- }
- _DDataGrid = value;
- Init();
- }
- }
- public ObservableCollection<ExpandoObject> Items
- {
- get { return _Items; }
- set
- {
- _Items = value;
- RaisePropertyChanged(() => Items);
- }
- }
- #region 方法
- /// <summary>
- /// 初始化
- /// </summary>
- public void Init()
- {
- Items.Clear();
- for (int i = ; i < ; i++)
- {
- dynamic item = new ExpandoObject();
- item.A = "Property A value - " + i.ToString();
- item.B = "Property B value - " + i.ToString();
- _Items.Add(item);
- }
- DDataGrid.Columns.Add(new DataGridTextColumn() { Header = "A", Binding = new Binding("A") });
- DDataGrid.Columns.Add(new DataGridTextColumn() { Header = "B", Binding = new Binding("B") });
- _DDataGrid.ItemsSource = Items;
- }
- public void AddData()
- {
- //dynamic item = new ExpandoObject();
- //item.A = "New Item - A";
- //item.B = "New Item - B";
- //item.NewColumn1 = "New Item - C";
- //Items.Add(item);
- }
- /// <summary>
- /// 添加列和列数据
- /// </summary>
- /// <param name="columnName">列名</param>
- /// <param name="columnName">显示列名</param>
- /// <param name="vs">填充的列数据</param>
- public void AddColumn(string columnName, string Header, List<string> vs)
- {
- int i = ;
- int count = vs.Count;
- //循环获取行数据
- foreach (IDictionary<String, Object> item in Items)
- {
- //每行添加新列数据
- item.Add(columnName, vs[i]);
- i++;
- //添加完数据跳出
- if (i >= vs.Count) break;
- }
- //如果列数据多,则继续添加
- for (; i < vs.Count; i++)
- {
- //可以这么用 columnName就是传进来的列名
- dynamic item = new ExpandoObject();
- item.columnName = vs[i];
- Items.Add(item);
- }
- //添加列
- DDataGrid.Columns.Add(new DataGridTextColumn()
- {
- Header = Header,
- Binding = new Binding(columnName)
- });
- }
- /// <summary>
- /// 删除选中列
- /// </summary>
- public void DeleteColumn()
- {
- for (int i = ; i < DDataGrid.SelectedCells.Count; i++)
- {
- //DataRowView Row = (DataRowView)DDataGrid.SelectedCells[i].Item;
- //string result = Row[DDataGrid.SelectedCells[i].Column.DisplayIndex].ToString();
- //string result = DDataGrid.SelectedCells[i].Column.DisplayIndex.ToString();
- DDataGrid.Columns.Remove(DDataGrid.SelectedCells[i].Column);
- }
- }
- #endregion
- }
- public class W1ViewModel : ViewModelBase
- {
- /// <summary>
- /// Initializes a new instance of the MainViewModel class. DataGrid
- /// </summary>
- public W1ViewModel(DyDataGridViewModel dyDataGridViewModel)
- {
- DyDGrid = dyDataGridViewModel;
- }
- public DyDataGridViewModel DyDGrid;
- public RelayCommand AddColumnCmd => new Lazy<RelayCommand>(() =>
- new RelayCommand(AddColumn)).Value;
- public RelayCommand AddDataCmd => new Lazy<RelayCommand>(() =>
- new RelayCommand(AddData)).Value;
- public RelayCommand DeleteColumnCmd => new Lazy<RelayCommand>(() =>
- new RelayCommand(DeleteColumn)).Value;
- private void AddData()
- {
- DyDGrid.AddData();
- }
- int newColumnIndex = ;
- private void AddColumn()
- {
- string cName = "C" + newColumnIndex;
- List<string> vs = new List<string>();
- for (int i = ; i < newColumnIndex; i++)
- {
- vs.Add("New Item - D" + i);
- }
- DyDGrid.AddColumn(cName, cName + "Show", vs);
- newColumnIndex++;
- }
- private void DeleteColumn()
- {
- DyDGrid.DeleteColumn();
- }
- }
DyDataGridViewModel封装了对DataGrid的操作,同时也是DataGrid的数据源,可以使用绑定更新
效果如下:
链接: https://pan.baidu.com/s/1eDRHMUzvpQyTjnmqoscpKw 提取码: txs6
想了想,还是把整个代码发上来,哈哈,感觉你们应该喜欢。
Wpf DataGrid动态添加列,行数据(二)的更多相关文章
- Wpf DataGrid动态添加列,行数据(一)
由于最近有这方面的需求,而且刚接触wpf不久,在网上找了很多方法,都不是使用MVVM模式的,因为DataGrid的列不能绑定 这就难受了,我想了个折中的方法,这个是使用了MVVMLight的消息机制, ...
- WPF Datagrid 动态生成列 并绑定数据
原文:WPF Datagrid 动态生成列 并绑定数据 说的是这里 因为列头是动态加载的 (后台for循环 一会能看到代码) 数据来源于左侧列 左侧列数据源 当然num1 属于临时的dome使用 可 ...
- WPF datagrid 动态增加列
DataGrid动态增加列 <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.m ...
- WPF DataGrid动态生成列的单元格背景色绑定
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.DisplayInde ...
- asp.net gridview动态添加列,并获取其数据;
1,绑定数据前先动态添加列,见方法CreateGridColumn(只在第一次加载动态添加): 2,gvlist_RowDataBound为对应列添加控件: 前台代码: <%@ Page Lan ...
- EasyUI datagrid动态生成列
任务描述:根据用户选择时间段,生成列数据,如图
- C# DataGridView控件动态添加新行
C# DataGridView控件动态添加新行 DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如 ...
- GridView动态添加列之后,导致PostBack(回发)页面数据丢失问题解决
直入主题,首先声明,这个问题是无法解决的,特此在这说明 一.如何动态添加列,如下: 在页面重写OnInit事件,至于为什么要在这个事件写,根据页面的声明周期和经验可知(不用去别的地方找了,这个我找了之 ...
- C# DataGridView控件 动态添加新行
DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行, ...
随机推荐
- java 多行注释
public class Sample { public static void main(String[] args) { // java compiler ignores the comment ...
- 推荐一款移动端日历App吉日历
推荐一款移动端日历App吉日历 一 应用描述 万年历.日历.农历.黄历.假期安排.天气预报.记事提醒便捷查看,一目了然! 二 功能介绍: 1.万年历:精美的日期展示,完整的节日日历随意查看,节假日.休 ...
- Feign的介绍和使用
一.Feign的简介 Feign是一个声明式 WebService 客户端,使用Feign能够让编写Web Service 客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持J ...
- HTML连载29-div和span标签
一.div标签 1.作用:一般用于配合CSS完成网页的基本布局 2.例子: <style> .head{ width: 980px; height: 100px; background: ...
- 在Mu-kittenbot中使用Robotbit固件
首先,先下载安装支持robotbit扩展板的Mu: http://cdn.kittenbot.cn/mu/mu-kittenbot.exe 标准的3针插口,信号,正电,负电,可接市面的arduino模 ...
- SQL Server ---------- 分离数据库 生成 .mdf文件
1.首先查看你要分离的数据库存储的位置 选中需要分离的数据数据库右击鼠标点击属性 要是记不住建议 复制一下 2.分离数据库 生成 .mdf 文件 右击 -----> 任务 -- ...
- 关于stm32f10x_conf.h文件
简介 stm32f10x_conf.h文件有2个作用:①提供对assert_param运行时参数检查宏函数的定义.②将开发者用到的标准外设头文件集中在这个文件里面,而stm32f10x_conf.h又 ...
- Idea java 中导包路径分析
工具类所在包: 查看工具类详情: 调用这个工具类时,导入的包路径为: 路径就是第1张图片中的包名utils+类名NumberUtils组成的utils.NumberUtils
- 《 .NET并发编程实战》阅读指南 - 第1章
先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.
- WPF 精修篇 动态资源
原文:WPF 精修篇 动态资源 动态资源 使用 DynamicResource 关键字 静态 就是 StaticResource 原则上是 能用静态就用静态 动态会让前台界面压力很大~ 动态资源引用 ...