Bind Datatable with DataGrid in WPF & MVVM

本文关键字:amp MVVM WPF in Datatable with DataGrid Bind | 更新日期: 2023-09-27 18:24:41

我是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<DataColumn> columns = new List<DataColumn>();
        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代码--

     <DataGrid Grid.Row="0" AutoGenerateColumns="True" ItemsSource="{Binding ManualDataTable}" CanUserAddRows="True" CanUserDeleteRows="True" IsReadOnly="False"  Name="dataGridManualData"/>

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

如有任何帮助,我们将不胜感激。

提前感谢!

Bind Datatable with DataGrid in WPF & MVVM

我创建了一个简单的测试项目来获得您所得到的,但它可以毫无问题地工作。也许你应该发布你的代码并说明哪些不起作用。

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

<DockPanel>
    <Button Height="23" Content="sdf" Click="Button_Click" />
    <DataGrid ItemsSource="{Binding MyTable}" CanUserAddRows="True"/>
</DockPanel>

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

我遇到了和你一样的问题:CanUserAddRows总是false。

事实证明,绑定是可以的,但我所绑定的类没有默认的构造函数。

这项工作:

private ObservableCollection<Point> m_points;
public ObservableCollection<Point> 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<Point> m_points;
public ObservableCollection<Point> 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;
    }
}