2013-01-07 57 views
4

我在一個名爲MainWindow的窗口上有一個DataGrid控件。在MainWindow中,我使用下面的代碼打開另一個窗口NewCustomerWindow。從另一個窗口更新WPF中的DataGrid

NewCustomerWindow newCustomerWindow = new NewCustomerWindow(); 
newCustomerWindow.ShowDialog(); 

在NewCustomerWindow我有文本框如果有人可以進入有關客戶的信息,然後將這些信息保存到數據庫的形式。之後,我保存這些信息,我要更新的數據網格的主窗口,所以我用下面的代碼

var mainWindow = Application.Current.Windows 
       .OfType<MainWindow>() 
       .FirstOrDefault(window => window is MainWindow); 

mainWindow.customersGrid.Items.Add(new 
      { 
       CustomerID = txtCustomerID.Text, 
       CompanyName = txtCompanyName.Text, 
       ContactName = txtContactName.Text, 
       ContactTitle = txtContactTitle.Text, 
       Address = txtAddress.Text, 
       City = txtCity.Text, 
       Region = txtRegion.Text, 
       PostalCode = txtPostalCode.Text, 
       Country = txtCountry.Text, 
       Phone = txtPhone.Text, 
       Fax = txtFax.Text 
      }); 

上面的代碼返回以下錯誤:「操作是無效的,同時的ItemsSource正在使用中訪問和修改。改爲使用ItemsControl.ItemsSource的元素。「

customersGrid是MainWindow中DataGrid的名稱,其結構如下。

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="8,29,8,8" Name="customersGrid" VerticalAlignment="Stretch" Loaded="customersGrid_Loaded"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Width="Auto" Binding="{Binding CustomerID}" Header="Κωδικός Πελάτη"/> 
      <DataGridTextColumn Width="Auto" Binding="{Binding CompanyName}" Header="Όνομα Εταιρίας"/> 
      <DataGridTextColumn Width="Auto" Binding="{Binding ContactName}" Header="Όνομα Επαφής"/> 
      <DataGridTextColumn Width="Auto" Binding="{Binding ContactTitle}" Header="Τίτλος Επαφής"/> 
      <DataGridTextColumn Width="Auto" Binding="{Binding Address}" Header="Διεύθυνση"/> 
      <DataGridTextColumn Width="Auto" Binding="{Binding City}" Header="Πόλη"/> 
      <DataGridTextColumn Width="Auto" Binding="{Binding Region}" Header="Περιοχή"/> 
      <DataGridTextColumn Width="Auto" Binding="{Binding PostalCode}" Header="Ταχυδρομικός Κώδικας"/> 
      <DataGridTextColumn Width="Auto" Binding="{Binding Country}" Header="Χώρα"/> 
      <DataGridTextColumn Width="Auto" Binding="{Binding Phone}" Header="Τηλέφωνο"/> 
      <DataGridTextColumn Width="Auto" Binding="{Binding Fax}" Header="Fax"/> 
     </DataGrid.Columns> 
    </DataGrid> 

我想,一個解決方案是將所有的數據重新設置DataGrid的ItemsSource屬性,但因爲客戶數據是從它帶來了很多的記錄WCF服務的未來,這是不是一個好的選擇。那麼,這個問題有什麼好的解決方案?先謝謝你。

+0

你應該綁定ÿ我們的dataGrid到一些viewmodels依賴屬性,並更新屬性而不是尋找主窗口 – makc

+0

Hello @makc。你能否提供一些關於你的建議的進一步信息,因爲我不熟悉這一點。謝謝。 –

+0

什麼是你的DataGrid的/窗口的DataContext? –

回答

2

您設置MainWindow.DataContext = MainViewModel.Instance (你的選擇創建一個單身或沒有)

您MainViewModel類應該有一個ObservableCollection依賴屬性讓調用它的客戶。 您在DataGrid綁定爲客戶

<DataGrid ItemsSource="{Binding Customers}" /> 

所以當你要更新的數據網格您只需更新客戶(例如,從NewCustomerWindow)和數據網格將自動更新

這裏有很好的例子:

A-Practical-Quick-start-Tutorial-on-MVVM-in-WPF

DataGrid Tutorial

+0

感謝您的進一步解釋和鏈接 –

相關問題