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控件添加新行, ...
随机推荐
- git开发中常用命令
项目代码克隆岛本地 git clone 项目地址 #如:git clone http://cngit.fir.ai/data_service/distributedstorage.git 克隆指定分支 ...
- 图论问题(2) : hdu 1102
题目转自hdu 1102,题目传送门 题目大意: 输入一个n*n的邻接矩阵,其中i行j列代表从i到j的路径的长度 然后又m条路已经帮你修好了,求最短要修多长的路才能使所有村庄连接 不难看出,这道题就是 ...
- 第01组 Beta冲刺(2/5)
队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11998909.html 作业博客: https://edu.cnblogs.com/campus/fz ...
- http & https & http/2 & SPDY & WebSocket
参考文章: http https :https://www.jianshu.com/p/d286d097e56b https & ssl:https://www.jianshu.com/p/2 ...
- Netty FixedChannelPool
如今越来越多的应用采用Netty作为服务端高性能异步通讯框架,对于客户端而言,大部分需求只需和服务端建立一条链接收发消息.但如果客户端需要和服务端建立多条链接的例子就比较少了. 最简单的实现就是一个f ...
- 如何在 VS2015 上开发 Qt 程序
所有Qt版本下载地址: http://download.qt.io/archive/qt/ 所有Qt Creator下载地址: http://download.qt.io/archive/qtcrea ...
- Qt Quick 基本元素初体验
Qt Quick 作为 QML 语言的标准库,提供了很多基本元素和控件来帮助我们构建 Qt Quick 应用,这节我们简要地介绍一些 Qt Quick 元素. 一. 基本可视化项 1.1 Item I ...
- fiddler抓包-6-Copy与Save常用技巧
前言 我们保存会话有什么用呢?很显然就是让开发知道整个接口的入参.出参的情况,不然你截个图我还得一个一个敲或者找回我的接口重新用postman请求一下,我不信会出错. 截图还不如复制粘贴接口url.参 ...
- SQL Inserted 触发器游标结合实例
SqlServer的Inserted可能是一个集合而不是一条数据,如果有如果需要对插入数据进行处理,有时需要用游标逐条处理 FROM inserted) --插入和更新 declare cur cur ...
- 关于 Task.Run 简单的示例
1. 关于 Task.Run 简单的示例01 直接贴代码了: public static class TaskDemo01 { public static void Run() { Console.W ...