由于最近有这方面的需求,而且刚接触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. 【LG5330】[SNOI2019]数论

    [LG5330][SNOI2019]数论 题面 洛谷 题目大意: 给定集合\(\mathbb {A,B}\) 问有多少个小于\(T\)的非负整数\(x\)满足:\(x\)除以\(P\)的余数属于\(\ ...

  2. pgsql 的函数

    因为pgsql中没有存储过程和包,所以类似功能通过函数来实现 PostgreSQL的存储过程简单入门 http://blog.csdn.net/rachel_luo/article/details/8 ...

  3. LeetCode 118:杨辉三角 II Pascal's Triangle II

    公众号:爱写bug(ID:icodebugs) 作者:爱写bug 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. Given a non-negative index k whe ...

  4. mysql的简介和使用

    mysql简介 数据的所有存储,检索,管理和处理实际上是由数据库软件--DBMS(数据库管理系统)完成的 mysql是一种DBMS,即它是一种数据库软件 mysql工具 mysql是一个客户机-服务器 ...

  5. ng的动画过渡

    动画过渡两种方法 1.使用angular+animation实现 在app-module.ts中引入 BrowserAnimationsModule 1.import { BrowserAnimati ...

  6. ConcurrentHashMap 源码分析,基于JDK1.8

    1:几个重要的成员变量: private static final int MAXIMUM_CAPACITY = 1 << 30; //map 容器的最大容量 private static ...

  7. 如何解决macbook pro摄像头不工作的问题

    背景:上周用qq视频聊天都正常,这周突然显示检测不到摄像头.打开facetime和photo booth也显示“相机未连接”排查一切问题后只好给苹果客服打电话,在客服的帮助下解决了这个问题. 解决办法 ...

  8. C#左移运算符

     << 左移操作符.简单理解是对变量进行与2的n次乘方的运算.比如x<<1=x*2x<<2=x*4x<<3=x*8x<<4=x*16依此类推 ...

  9. 解决Web部署 svg/woff/woff2字体 404

    1.打开服务器IIS管理器,找到MIME类型 2.添加类型 文件扩展名      MIME类型 .svg             image/svg+xml.woff            appli ...

  10. C# 通过反射获取winform上的控件

    比如获取Button按钮: System.Reflection.FieldInfo[] fieldInfo = form.GetType().GetFields(System.Reflection.B ...