WpfDataGrid动态添加列,行数据(一)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运行效果
删除B列 我在尝试不用消息的方式,直接绑定,成功再发。
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 RelayCommand AddDataCmd => new Lazy<RelayCommand>(() => new RelayCommand(AddData)).Value;
public RelayCommand DeleteColumnCmd => new Lazy<RelayCommand>(() => new RelayCommand(DeleteColumn)).Value;
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
WpfDataGrid动 态 添 加 列 , 行 数 据 ( 一 )
由于最近有这方面的需求,而且刚接触wpf不久,在网上找了很多方法,都不是使用MVVM模式的,因为DataGrid的列不能绑定 这就难受了,我想了个折中的方法,这个是使用了MVVMLight的消息机制,我就不说太多了,直接上代码 UI界面
DDataGrid.Columns.Add(new DataGridTextColumn() { Header = "NewColumn" + newColumnIndex, Binding = new Binding("NewColumn" + newColumnIndex) });
newColumnIndex++; }
} /// <summary> /// 绑定的数据 /// </summary> ObservableCollection<ExpandoObject> _Items = new ObservableCollection<ExpandoObject>();
public DataGrid DDataGrid;
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); }
//string result = DDataGrid.SelectedCells[i].Column.DisplayIndex.ToString();
DDataGrid.Columns.Remove(DDataGrid.SelectedCells[i].Column); } } }
记得在界面上绑定MainViewModel
int newColumnIndex = 1; private void AddColumn() {
foreach (IDictionary<String, Object> item in Items) {
item.Add("NewColumn" + newColumnIndex, "New Column Value - " + newColumnIndex.ToString()); }
</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 = 0; i < 5; i++) { dynamic item = new ExpandoObject(); item.A = "Property A value - " + i.ToString();
private void DeleteColumn() {
for (int i = 0; i < 43;) {
//DataRowView Row = (DataRowView)DDataGrid.SelectedCells[i].Item; //string result = Row[DDataGrid.SelectedCells[i].Column.DisplayIndex].ToString();
<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"/>
public ObservableCollection<ExpandoObject> Items {
get { return _Items; } set {
_Items = value; RaisePropertyChanged(()=> Items); } }
public RelayCommand AddColumnCmd => new Lazy<RelayCommand>(() => new RelayCommand(AddColumn)).Value;
删除B列 我在尝试不用消息的方式,直接绑定,成功再发。
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 RelayCommand AddDataCmd => new Lazy<RelayCommand>(() => new RelayCommand(AddData)).Value;
public RelayCommand DeleteColumnCmd => new Lazy<RelayCommand>(() => new RelayCommand(DeleteColumn)).Value;
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
WpfDataGrid动 态 添 加 列 , 行 数 据 ( 一 )
由于最近有这方面的需求,而且刚接触wpf不久,在网上找了很多方法,都不是使用MVVM模式的,因为DataGrid的列不能绑定 这就难受了,我想了个折中的方法,这个是使用了MVVMLight的消息机制,我就不说太多了,直接上代码 UI界面
DDataGrid.Columns.Add(new DataGridTextColumn() { Header = "NewColumn" + newColumnIndex, Binding = new Binding("NewColumn" + newColumnIndex) });
newColumnIndex++; }
} /// <summary> /// 绑定的数据 /// </summary> ObservableCollection<ExpandoObject> _Items = new ObservableCollection<ExpandoObject>();
public DataGrid DDataGrid;
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); }
//string result = DDataGrid.SelectedCells[i].Column.DisplayIndex.ToString();
DDataGrid.Columns.Remove(DDataGrid.SelectedCells[i].Column); } } }
记得在界面上绑定MainViewModel
int newColumnIndex = 1; private void AddColumn() {
foreach (IDictionary<String, Object> item in Items) {
item.Add("NewColumn" + newColumnIndex, "New Column Value - " + newColumnIndex.ToString()); }
</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 = 0; i < 5; i++) { dynamic item = new ExpandoObject(); item.A = "Property A value - " + i.ToString();
private void DeleteColumn() {
for (int i = 0; i < 43;) {
//DataRowView Row = (DataRowView)DDataGrid.SelectedCells[i].Item; //string result = Row[DDataGrid.SelectedCells[i].Column.DisplayIndex].ToString();
<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"/>
public ObservableCollection<ExpandoObject> Items {
get { return _Items; } set {
_Items = value; RaisePropertyChanged(()=> Items); } }
public RelayCommand AddColumnCmd => new Lazy<RelayCommand>(() => new RelayCommand(AddColumn)).Value;