2010-10-26 99 views
2

我有一個Silverlight Business Aplication(RIA服務),我有一個DataGrid附加到DataSource的DataContext。在Silverlight子級Windows中,我創建一個新實體並將更改提交給服務器。 問題是我的DataContext不知道,所以網格不顯示新添加的實體。如何重新加載DataContext?

如何刷新DataContext或指示DataGrid重新綁定?

編輯:這是我的代碼

<riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:Team, CreateList=true}" Height="0" LoadedData="teamDomainDataSource_LoadedData" Name="teamDomainDataSource" QueryName="GetTeamsQuery" Width="0"> 
     <riaControls:DomainDataSource.DomainContext> 
      <my:F1DomainContext /> 
     </riaControls:DomainDataSource.DomainContext> 
</riaControls:DomainDataSource> 

<sdk:DataGrid AutoGenerateColumns="False" Height="200" ItemsSource="{Binding ElementName=teamDomainDataSource, Path=Data}" Name="teamDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" DataContext="{Binding}"> 
        <sdk:DataGrid.Columns> 
         <sdk:DataGridTextColumn x:Name="idColumn" Binding="{Binding Path=Id, Mode=OneWay}" Header="Id" IsReadOnly="True" Width="SizeToHeader" /> 
         <sdk:DataGridTextColumn x:Name="nameColumn" Binding="{Binding Path=Name}" Header="Name" Width="SizeToHeader" /> 
        </sdk:DataGrid.Columns> 
</sdk:DataGrid> 

正如你可以看到我的teamDataGrid的的ItemSource高於

回答

0

所以以下@Kyle建議後,我得到了以下錯誤:

當CanLoad是假的,不能進行加載操作。當CanLoad是假

所以我用Google搜索周圍,我發現this post這表明圍繞這個工作的「不是太漂亮」的方式來調用加載操作控件應該被禁用...但它的伎倆。

所以這是我的固定它...

teamDataGrid.ItemsSource = null; 
teamDataGrid.ItemsSource = ((F1DomainContext)teamDomainDataSource.DomainContext).Teams; 

因此,我所做的只是重新綁定數據源到我的網......沒有任何人知道一個更漂亮呢?

0

定義的teamDomainDataSource確保您的DataGrid的‘名單’的類型爲:的ObservableCollection。易於實施並允許進行此類通知。

讓我知道你是否需要進一步的幫助。

+0

嘿,不知道我是否理解你的建議......我需要改變什麼?我添加了一些代碼,可以看到我在說什麼 – sebagomez 2010-10-26 16:15:45

+0

哦,我明白了,我沒有注意到您使用的是RIA服務。所以,讓我問,你的查詢,我會想像公共ObservableCollection GetTeamsQuery()...你可以發佈一些更多的代碼(尤其是代碼隱藏)嗎?另外,當你通過childWindow添加一個新對象時,確保你添加了這個集合並且它應該被複制。 – user118190 2010-10-26 18:10:01

0

您的兩個最佳選擇是(1)使用DomainDataSource.Load()重新加載DDS以獲取最新數據,或者(2)在使用DomainDataSource.DataView.Add()提交它之前通過DDS添加實體。

+0

您好凱爾,我更喜歡做.Load(),但我得到了以下錯誤信息,我是關於谷歌:CanLoad爲false時無法執行加載操作。當CanLoad爲false時,應該禁用調用加載操作的控件。有任何建議嗎? – sebagomez 2010-10-27 18:07:02

+0

或多或少,當有未提交的更改時,您不能重新加載(您不想丟失它們,對吧?)。通常這與DDS.DomainContext.HasChanges有關。 – 2010-10-28 15:19:06

1

這是一個老問題,但我有類似的問題,發現CanLoad是錯誤的。在用Reflector調查這個之後,我發現只有當域上下文已經改變或者當前正在保存或加載(這是我的情況)時才設置它。

從DomainDataSource類

private void UpdateCanLoadProperty() 
{ 
    this.CanLoad = !this.IsSubmittingChanges && !this.HasChanges; 
    if (this.HasChanges && this.IsLoadingData) 
    { 
     this.CancelLoadPrivate(); 
    } 
} 

而在負載的方法,你可以看到它拋出,你收到的錯誤:

public void Load() 
{ 
    if (!DesignerProperties.IsInDesignTool) 
    { 
     if (this.DomainContext == null) 
     { 
      throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, DomainDataSourceResources.OperationNeedsPropertySet, new object[] { "DomainContext", DomainDataSourceResources.LoadOperation })); 
     } 
     if (string.IsNullOrEmpty(this.QueryName)) 
     { 
      throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, DomainDataSourceResources.OperationNeedsPropertySet, new object[] { "QueryName", DomainDataSourceResources.LoadOperation })); 
     } 
     if (this._loadDeferLevel > 0) 
     { 
      throw new InvalidOperationException(DomainDataSourceResources.LoadWithinDeferLoad); 
     } 
     this.ValidateQueryParameters(); 
     if (this._preparingOperation) 
     { 
      throw new InvalidOperationException(DomainDataSourceResources.InvalidOperationDuringLoadOrSubmit); 
     } 
     if (!this.CanLoad) 
     { 
      throw new InvalidOperationException(DomainDataSourceResources.CannotLoadWhenCanLoadIsFalse); 
     } 
     this.ExecuteLoad(this.InitialLoadType); 
    } 
} 

爲了處理這個錯誤你」您需要提交您的更改(或拒絕他們,無論哪個是正確的)。如果您使用SubmitChanges方法提交更改,則會發現它包含一個重載,其中包含要調用Load方法的回調。實質上,當有變化時你不能調用負載。