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控件添加新行, ...
随机推荐
- 关于对pei
我现在才开始整理这个不算晚吧...... 望轻喷 学习博客 我们需要四个程序 1.暴力 2.“正解” 3.数据生成器 4.检查程序 暴力: 就是暴力 eg: #include <cstdio&g ...
- KMP——从入门到不会打题
KMP——从入门到不会打题 前言 如果你不了解哈希,建议先观看本蒟蒻的另一篇博客,对哈希有一定的理解 哈希大法吼 KMP算法,别名烤馍片或者看毛片,由烤馍片男子天团三位神犇同时发现的一种强大的单模 ...
- [LeetCode] 147. Insertion Sort List 链表插入排序
Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...
- [LeetCode] 63. Unique Paths II 不同的路径之二
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...
- Windows&Mac安装Redis
Windows&Mac安装Redis Window 下安装Redis Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择,这里我下载 Redis-x64-xxx.zi ...
- Nginx配置max_fails fail_timeout
目的: 通过配置max_fails.fail_timeout来达到当一台服务器访问出现非200时可以跳转到另一台服务器 操作: 配置nginx.conf文件 具体配置如下 upstream Site ...
- SpringBoot第三篇:配置文件详解二
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10615605.html 版权声明:本文为博主原创文章,转载请附上博文链接! 前言 本文主要讲 ...
- mysql 基本操作 四
1.临时表 当绘画结束时,临时表会自动销毁,无法用show tables 查看 临时表. MariaDB [jason]> create temporary table tmp(pro ),ci ...
- 多项式 ln
多项式 ln 定义 \(给一多项式F(x),求G(x)\equiv lnF(x)\pmod x^n\) 前置知识 \(不定积分\) \(微分\) \(多项式乘法逆\) 推式子: \[\because ...
- rocketmq常用命令整理
1. 启动namesrv和borker sh /opt/alibaba-rocketmq/bin/runserver.sh com.alibaba.rocketmq.namesrv.NamesrvSt ...