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控件添加新行, ...
随机推荐
- [LeetCode] 204. Count Primes 质数的个数
Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Output: 4 E ...
- SpringBoot集成Spring Security(3)——异常处理
源码地址:https://github.com/jitwxs/blog_sample 文章目录 一.常见异常二.源码分析三.处理异常不知道你有没有注意到,当我们登陆失败时候,Spring securi ...
- pandas的使用(7)--分组
pandas的使用(7)--分组
- Ceph更换OSD磁盘
目录 简介 更换OSD操作步骤 1. 故障磁盘定位 2. 摘除故障磁盘 3. 重建raid0 4. 重建osd 控制数据恢复及回填速度 简介 首先需要说明的是,ceph的osd是不建议做成raid10 ...
- Hbase put写入源码分析
今天有空闲时间看一下HBASE的写入代码 MutiAction类,是一个action的container,包括get . put. delete.并且是根据region name分组的.其中核心的就是 ...
- ReentrantLock的实现原理及AQS和CAS
AQS,即AbstractQueuedSynchronizer, 队列同步器,它是多线程访问共享资源的同步器框架,Java中的ReentrantLock/Semaphore/CountDownLatc ...
- 2019-11-29-WPF-绑定命令在-MVVM-的-CanExecute-和-Execute-在按钮点击都没触发可能的原因...
原文:2019-11-29-WPF-绑定命令在-MVVM-的-CanExecute-和-Execute-在按钮点击都没触发可能的原因... title author date CreateTime c ...
- 2019-11-29-win10-uwp-颜色转换
原文:2019-11-29-win10-uwp-颜色转换 title author date CreateTime categories win10 uwp 颜色转换 lindexi 2019-11- ...
- Client 客户端AspNetCore.SignalR 通讯服务器 Quartz 执行任务
背景 需要Client跑服务在终端间隔执行任务,我的目标是运行在树莓派上 Client代码 如果未连接成功时隔3秒重新连接服务器 public static void Reconnect() { va ...
- 有关Oracle 查询时间的记录 (1)
目录 写在前面 一.年.月.日.季.周 二.EXTRACT 年.月.日 三.上个星期一到星期天 四.1分钟前.1小时前.1月前.1年前 五.当月.上月.当天.前天 写在前面 在使用Oracle数据开发 ...