在WPF和MVVM中使用DataGrid绑定数据表

我是WPF的新手,我在WPF中使用MVVM模式并在运行时生成Datatable结构,然后将Datatable与DataGrid / RadGridView绑定,这正在按预期工作。

问题:我希望DataGrid / RadGridView可配置(用户可以在其中添加新行,删除行和编辑数据),在保存按钮单击时,所有内容都应保存在数据库中。 我有一种情况,我需要创建一个具有不同列的空DataTable(取决于用户输入)。 然后在这些列下输入值,然后单击“保存需要”以保存数据库中的值。 我能够将DataTable绑定到DataGrid(如果网格中的DataTable中已经存在一些数据,我可以看到所有列名和数据行)但是无法在运行时从DataGrid添加(输入)或删除任何行。 我为CanUserDeleteRows和CanUserInsertRows设置了“True”值。 我不知道我哪里出错了。 我在我的ViewModel类中实现了INotifyPropertyChanged。

我正在努力获得理想的结果。

我的代码如下所示:

ViewModel–

DataTable _manualDataTable; public DataTable ManualDataTable { get { return _manualDataTable; } set { _manualDataTable = value; OnPropertyChanged("ManualDataTable"); } } 

用于创建DataTable–

  void LoadManualDataTable() { DataTable dtData = new DataTable(); dtData.Columns.Add("TimeStamp", typeof(DateTime)); List columns = new List(); var query = _dataContext.GetSenData().Where(sen => sen.LogID == ((DataLogs)SelectedItemNode).Logger.LogID).Select(sen => sen.SeriesID); var queryTS = _dataContext.GetDataSeries().Where(ts => query.Contains(ts.SeriesID)); foreach (DataSeries ts in queryTS) { var queryPLoc = _dataContext.GetDataLoc().Where(pLoc => pLoc.ParamID == ts.ParamID).Select(pLoc => pLoc.Name); dtData.Columns.Add(queryPLoc.First(), typeof(string)); } ManualDataTable = dtData; } 

XAML代码 –

   

DataTable是按预期创建的(来自LoadManualDataTable方法),如果我将通过代码添加任何行,那么这些行将被绑定并将显示在DataGrid中。 但我无法通过DataGrid创建或删除行。

任何帮助将受到高度赞赏。

提前致谢!

我创建一个简单的测试项目来获得你得到的东西,但它的工作没有任何问题。 也许你应该发布你的代码,并说明什么是行不通的。

 public partial class MainWindow : Window { public DataTable MyTable { get; set; } public MainWindow() { InitializeComponent(); this.MyTable= new DataTable(); this.MyTable.Columns.Add("Test"); var row1 = this.MyTable.NewRow(); row1["Test"] = "dsjfks"; this.MyTable.Rows.Add(row1); this.DataContext = this; } private void Button_Click(object sender, RoutedEventArgs e) { MessageBox.Show("rows: " + this.MyTable.Rows.Count); } } 

XAML

     

我不确定我的答案,但我会尝试……

我遇到了同样的问题:CanUserAddRows总是假的。

事实certificate绑定没问题,但是我绑定的类没有默认构造函数。

这个作品:

 private ObservableCollection m_points; public ObservableCollection Points { get { return m_points; } set { m_points = value; } } public class Point { public double X { get; set; } public double Y { get; set; } public Point() { this.X = 0; this.Y = 0; } public Point(double x, double y) { this.X = x; this.Y = y; } } 

这不行:

 private ObservableCollection m_points; public ObservableCollection Points { get { return m_points; } set { m_points = value; } } public class Point { public double X { get; set; } public double Y { get; set; } public Point(double x, double y) { this.X = x; this.Y = y; } }