由于最近有这方面的需求,而且刚接触wpf不久,在网上找了很多方法,都不是使用MVVM模式的,因为DataGrid的列不能绑定

这就难受了,我想了个折中的方法,这个是使用了MVVMLight的消息机制,我就不说太多了,直接上代码

UI界面

<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 x:Name="dataGrid" AutoGenerateColumns="True" Grid.Row="1" SelectionUnit="Cell" SelectionMode="Extended"/>
</Grid>

  这里需要在

这里发一个消息,MessageToken如下:其实就是一个字符串类,防止重复

public class MessageToken
{
/// <summary>
/// 设置DataGrid消息
/// </summary>
public static readonly string SetDataGrid = nameof(SetDataGrid);
}

ViewModel

 public class MainViewModel : ViewModelBase
{
/// <summary>
/// Initializes a new instance of the MainViewModel class. DataGrid
/// </summary>
public MainViewModel()
{
//注册设置vm里的DataGrid与界面的相关联
Messenger.Default.Register<DataGrid>(this, MessageToken.SetDataGrid, (x) =>
{
DDataGrid = x; 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;
}); }
/// <summary>
/// 绑定的数据
/// </summary>
ObservableCollection<ExpandoObject> _Items = new ObservableCollection<ExpandoObject>(); public DataGrid DDataGrid; public ObservableCollection<ExpandoObject> Items
{
get { return _Items; }
set
{
_Items = value;
RaisePropertyChanged(()=> Items);
}
} 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()
{
dynamic item = new ExpandoObject();
item.A = "New Item - A";
item.B = "New Item - B";
item.NewColumn1 = "New Item - C";
Items.Add(item);
} int newColumnIndex = ;
private void AddColumn()
{
foreach (IDictionary<String, Object> item in Items)
{
item.Add("NewColumn" + newColumnIndex, "New Column Value - " + newColumnIndex.ToString());
} DDataGrid.Columns.Add(new DataGridTextColumn() { Header = "NewColumn" + newColumnIndex, Binding = new Binding("NewColumn" + newColumnIndex) }); newColumnIndex++;
} private 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);
}
}
}

记得在界面上绑定MainViewModel

运行效果

删除B列

我在尝试不用消息的方式,直接绑定,成功再发。

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

  1. Wpf 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. [转]RDLC报表——动态添加列

    本文转自:http://www.cnblogs.com/pszw/archive/2012/07/19/2599937.html 前言 最近接到一个需求:在给定的数据源中,某(些)列,可能需要单独统计 ...

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

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

随机推荐

  1. Idea中自动生成get,set,toString等方法

    https://blog.csdn.net/sinat_41226396/article/details/80770520 自动生成main函数: https://blog.csdn.net/fanr ...

  2. js获取长度,根据编码获取长度

    dataLen:function(str){ var realLength = 0, len = str.length, charCode = -1; for(var i = 0; i < le ...

  3. zipfile

    zipfile是一个用于处理zip压缩格式的文件的模块, 主要会用到它的ZipFile类 import zipfile zipfile.is_zipfile('myzip.zip')) # 判断一个文 ...

  4. 【07月16日】A股滚动市净率PB历史新低排名

    2010年01月01日 到 2019年07月16日 之间,滚动市净率历史新低排名. 上市三年以上的公司,2019年07月16日市净率在30以下的公司. 来源:A股滚动市净率(PB)历史新低排名. 1 ...

  5. 使用python把gdb格式的文本文件转为utf-8的格式

    # coding=utf-8 from os import listdir if __name__ =="__main__": d=u"D:\\files\\" ...

  6. 【题解】L 国的战斗续之多路出击 [P2129]

    [题解]L 国的战斗续之多路出击 [P2129] 传送门: \(L\) 国的战斗续之多路出击 \([P2129]\) [题目描述] 给出 \(n\) 个坐标,\(m\) 个指令,指令处理顺序应是从后往 ...

  7. DOM事件机制解惑(摘)--事件的传播机制

    DOM事件流 为什么是有事件流? 假如在一个button上注册了一个click事件,又在其它父元素div上注册了一个click事件,那么当我们点击button,是先触发父元素上的事件,还是button ...

  8. 使用 Spring Boot 构建 RESTful API

    1. 使用 Idea 创建 Spring Initializer 项目 在创建项目的对话框中添加 Web 和 Lombok,或者建立项目后在 pom.xml 中添加依赖: <dependency ...

  9. NIO ByteBuffer的allocate与allocateDirect区别(HeapByteBuffer与DirectByteBuffer的区别)

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类. ByteBuffer提供了两种静态实例方式: public stat ...

  10. 一次性删除master数据库中的所有用户添加的表

    执行查询命令 use master; go sp_msforeachtable @command1="drop table ?" go