这是第二中方法,可直接绑定,我这里只是做出了一种思路,并不是最完美。

这里注意一下,因为我里面引用了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动态添加列,行数据(二)的更多相关文章

  1. Wpf DataGrid动态添加列,行数据(一)

    由于最近有这方面的需求,而且刚接触wpf不久,在网上找了很多方法,都不是使用MVVM模式的,因为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. GridView动态添加列之后,导致PostBack(回发)页面数据丢失问题解决

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

  9. C# DataGridView控件 动态添加新行

    DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行, ...

随机推荐

  1. 一张思维导图辅助你深入了解 Vue | Vue-Router | Vuex 源码架构

    1.前言 本文内容讲解的内容:一张思维导图辅助你深入了解 Vue | Vue-Router | Vuex 源码架构. 项目地址:https://github.com/biaochenxuying/vu ...

  2. vue组件component没效果

    如果实在不知道问题所在,你就看看你的component的命名是不是驼峰命名

  3. ECMAScript 初探 - 对象篇

    一.对象 如果你用过 C++ 或 Java,肯定熟悉类(class).在 ECMAScript 中并没有 "类" 这个词, 其对应的是 "对象定义",不过这太拗 ...

  4. Python处理数据集-2

    原数据集的数据格式: 每行为:(test_User, test_Item) negativeItem1 negativeItem2 negativeItem3 …… negativeItem99 即每 ...

  5. centos下java环境搭建安装

    1. 购买服务器(阿里云) 2. 重置密码,重启服务器 3. 创建账号work groupadd work #创建组 mkdir /data # 创建数据文件夹 useradd -d /data/wo ...

  6. c++中获得对象类型 typeid 与 type_info

    复杂部分略去,摘录要素如下: 1.typeid是C++的关键字之一,等同于sizeof这类的操作符. 2.typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件type ...

  7. vue-v-xxx基于 Vue拓展的 v-xxx 库

    君问归期未有期,巴山夜雨涨秋池. 何当共剪西窗烛,却话巴山夜雨时. 作为vue轻车熟路的老司机,经常会用到一些指令,vue官方提供的指令又太少,无法满足旺盛的欲望,而每次要写一遍,终日郁郁寡欢,从小就 ...

  8. 使用jedis操作redis常用方法

    在redis入门及在商城案例中的使用中简单介绍了下使用jedis如何操作redis,但是其实方法是跟redis的操作大部分是相对应的.我这里做下记录 1.String类型操作 public class ...

  9. Kubectl 的替代品:kubeman

    周末闲逛 Twitter 时,发现一个很有意思的小工具叫 kubeman,野心倒是不小,励志成为 kubectl 的替代品,用于实时监控和管理 kubernetes 集群,还可以调试与 Istio 相 ...

  10. ioc与bean管理

    IOC称之为控制反转,简单来说就是将对象的创建的权利和对象的声明周期的管理过程交给Spring框架来处理,在这个开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要的时由Spring框架提供, ...