2012-02-14 93 views
2

我是WPF的新手,我在WPF中使用MVVM模式並在運行時生成Datatable結構,然後將Datatable與DataGrid/RadGridView綁定,該數據表按預期工作。在WPF和MVVM中綁定帶DataGrid的數據表

問題:我想要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"/> 

數據表是按預期創建(來自LoadManualDataTable方法),如果我將通過代碼添加任何行,那麼這些行將被綁定並顯示在DataGrid中。但我無法通過DataGrid創建或刪除行。

任何幫助將不勝感激。

在此先感謝!

+0

CanUserAddRows也應該是真實的。 – blindmeis 2012-02-15 07:01:55

+0

我很抱歉沒有把它放在我原來的文章中,但CanUserAddRows也是「真」。 – user178854 2012-02-15 20:05:45

回答

1

我創建了一個簡單 testproject得到你所得到的,但它的作品沒有任何問題。也許你應該發佈你的代碼並說明什麼不起作用。

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> 
+0

嗨, 感謝您的幫助和發送示例代碼片段。正如我在最初的問題描述中所說的,我能夠成功地將DataTable綁定到我的DataGrid。所以我可以看到我的所有列和當前數據(如果存在於我的DataTable中)。但我無法通過DataGrid添加新行,也無法刪除現有行。我認爲這是因爲在WPF/MVVM設計中,我們應該讓ICollection類型與網格綁定。我在我的初始文章中添加我的代碼供您參考。 – user178854 2012-02-17 19:44:38

0

我不知道我的回答,但我要去嘗試......

我有你同樣的問題:CanUserAddRows總是假的。

事實證明,綁定是好的,但我是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; 
    } 
}