2010-10-26 90 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方法的回调。实质上,当有变化时你不能调用负载。