在WPF和MVVM中使用DataGrid绑定Datatable

0kjbasz6  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(101)

我是WPF的新手,我在WPF中使用MVVM模式并在运行时生成Datatable结构,然后将Datatable与DataGrid/RadGridView绑定,这是预期的。
问题:我想DataGrid/RadGridView可配置(用户可以添加新行,删除行和编辑数据),并在保存按钮点击一切都应该保存在数据库中。我有一个情况,我需要创建一个空的DataTable与不同的列(取决于用户输入)。然后在这些列下输入值,然后点击“保存”将需要的值保存到数据库中。我可以将DataTable绑定到DataGrid(如果网格中的DataTable中已经有一些数据,我可以看到所有的列名和数据行),但不能在运行时从DataGrid添加(输入)或删除任何行。我已经为CanUserDeletetetable和CanUserInsertable设置了“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创建或删除行。
任何帮助将不胜感激。
提前感谢!

csbfibhn

csbfibhn1#

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

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>
b4lqfgs4

b4lqfgs42#

我不确定我的答案,但我会试试...
我也有同样的问题:CanUserAdd始终为false。
原来绑定是好的,但我被bindig的类没有默认的构造函数。
本作品:

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

相关问题