2014-06-26 38 views
0

我正試圖將ObservableCollection綁定到DataGrid綁定DataGrid時堆棧溢出WPF

CODE

private void LoadData_Loaded(object sender, RoutedEventArgs e) 
{ 
     ObservableCollection<LoadData> LoadDataSet = new ObservableCollection<LoadData>(); 
     var items = new List<LoadData>(); 

     LoadData load = new LoadData("1", "1", "1", "1"); 
     LoadDataSet.Add(load); 
     items.Add(load); 

     loadDataGrid.ItemsSource = items; 
} 

在主窗口

public MainWindow() 
{ 
     InitializeComponent(); 
     DataContext = this; 
} 

在XAML

DataGrid Name="loadDataGrid" HorizontalAlignment="Left" Margin="373,83,0,0" VerticalAlignment="Top" Height="64" Width="661" Loaded="LoadData_Loaded"/

然後我得到一個異常

類型 「System.StackOverflowException」 的未處理的異常出現在XXXX.EXE

這是爲什麼不工作?

+0

ü可以試試這個,在主窗口構造LoadData方法,避免Loaded事件[Datagrid的參考](http://wpftutorial.net/DataGrid.html)CodeProject上(HTTP:// www.codeproject.com/Tips/362436/Data-binding-in-WPF-DataGrid-control) – Eldho

+0

什麼行會拋出異常? – Matthijs

+0

你確定這是代碼嗎?如果(暫時)註釋掉LoadData_Loaded事件中的所有內容,異常是否仍然被拋出? –

回答

0

雖然我無法想象你做錯了什麼,但我可以告訴你如何做對。只要創建一個公共屬性爲您的收藏:

private ObservableCollection<LoadData> items; 
public ObservableCollection<LoadData> Items 
{ 
    get { return items; } 
    set { items = value; NotifyPropertyChanged("Items"); } 
} 

// Implement INotifyPropertyChanged interface here!! 

然後數據綁定該集合屬性的DataGrid.ItemsSource屬性:

<DataGrid Name="loadDataGrid" ItemsSource="{Binding Items}" HorizontalAlignment="Left" 
    Margin="373,83,0,0" VerticalAlignment="Top" Height="64" Width="661" /> 

於是最後,只需填寫您的收藏:

Items = new ObservableCollection<LoadData>(); 
LoadData load = new LoadData("1", "1", "1", "1"); 
LoadDataSet.Add(load); 
Items.Add(load); 
+0

非常感謝!您的消息幫助了很多!有用。 – user3777884

+0

但我意識到我遇到的問題與視圖或xaml本身無關,它是我的數據......我創建了一個cs文件來生成數據模型,但它不起作用。所以我把數據類放回到MainWindow.xaml.cs文件中,並將這些變量公開。那麼它的工作。 我仍然在尋找解決方案來提取數據模型 – user3777884

0

由於每個MSDNLoaded當元素佈局,呈現並準備好進行交互時發生事件。

所以我認爲,當你從LoadData_Loaded設置您DataGridItemSource,再次提高Loaded事件,導致DataGrid的和未結束遞歸,因此你越來越StackOverFlow例外。

建議您可以試試Eldho。不要在LoadData_Loaded中編寫代碼,而應將其寫入函數中,並從該類的構造函數中調用該函數。如下圖所示:

private void LoadDataInGrid(object sender, RoutedEventArgs e) 
{ 
     ObservableCollection<LoadData> LoadDataSet = new ObservableCollection<LoadData>(); 
     var items = new List<LoadData>(); 

     LoadData load = new LoadData("1", "1", "1", "1"); 
     LoadDataSet.Add(load); 
     items.Add(load); 

     loadDataGrid.ItemsSource = items; 
} 

public MainWindow() 
{ 
     InitializeComponent(); 
     DataContext = this; 
     LoadDataInGrid(); 
}