【问题标题】:Bind Datatable with DataGrid in WPF & MVVM在 WPF 和 MVVM 中将 DataTable 与 DataGrid 绑定
【发布时间】:2012-03-06 05:49:00
【问题描述】:

我是 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");
        }
    }

用于创建数据表--

    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 创建或删除行。

我们将不胜感激。

提前致谢!

【问题讨论】:

  • CanUserAddRows 也应该为真。
  • 很抱歉没有把它放在我原来的帖子里,但 CanUserAddRows 也是“真”。

标签: c# wpf mvvm


【解决方案1】:

我创建了一个 simple 测试项目来得到你所得到的,但它的工作没有任何问题。也许你应该发布你的代码并说明什么不起作用。

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>

【讨论】:

  • 您好,感谢您的帮助并发送示例代码 sn-p。正如我在最初的问题描述中所说,我能够成功地将 DataTable 绑定到我的 DataGrid。所以我可以看到我所有的列和当前数据(如果我的 DataTable 中有的话)。但我无法通过 DataGrid 添加新行,也无法删除现有行。我认为这是因为在 WPF/MVVM 设计中我们应该有 ICollection 类型来绑定网格。我将在我的初始帖子中添加我的代码供您参考。
  • @user178854 DataTable.DefaultView 没有实现 INotifyPropertyChanged。如果您想管理更改,您将需要实现更改检测,您可以使用 ObservableCollection 来完成。我相信您将需要创建一个具有与 DataTable 中的列相对应的属性的类。
【解决方案2】:

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

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

原来绑定没问题,但是我绑定的类没有默认构造函数。

这个作品:

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;
    }
}

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 2013-03-24
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2013-07-28
    • 2023-04-06
    相关资源
    最近更新 更多