我是WPF的新手,我在WPF中使用MVVM模式并在运行时生成Datatable结构,然后将Datatable与DataGrid / RadGridView绑定,这正在按预期工作。
问题:我希望DataGrid / RadGridView可配置(用户可以添加新行,删除行和编辑数据),然后在保存按钮上单击应保存在数据库中的所有内容。我有一种情况,我需要创建一个具有不同列的空DataTable(取决于用户输入)。然后在这些列下输入值,然后单击“保存需要”以保存数据库中的值。我能够将DataTable绑定到DataGrid(如果网格中的DataTable中已经有一些数据,我可以看到所有列名和数据行)但是无法在运行时从DataGrid添加(输入)或删除任何行。我已经设置了#34; True" CanUserDeleteRows和CanUserInsertRows的值。我不确定我哪里出错了。我在我的ViewModel类中实现了INotifyPropertyChanged。
我正在努力获得理想的结果。
我的代码如下所示:
视图模型 -
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创建或删除行。
任何帮助都将受到高度赞赏。
提前致谢!
答案 0 :(得分:1)
我创建了一个简单测试项目来获得你得到的东西,但它的工作没有任何问题。也许你应该发布你的代码并陈述什么是行不通的。
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>
答案 1 :(得分:0)
我不确定我的答案,但我会尝试......
我遇到了同样的问题: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;
}
}