如何重新加载DataContext?

时间:2010-10-26 15:25:35

标签: silverlight datagrid silverlight-4.0 wcf-ria-services

我有一个Silverlight Business Aplication(RIA服务),我有一个DataGrid附加到DataSource的DataContext。在Silverlight子窗口中,我创建一个新实体并将更改提交给服务器。 问题是我的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是上面定义的teamDomainDataSource

4 个答案:

答案 0 :(得分:1)

这是一个老问题,但我遇到了类似的问题,发现CanLoad是假的。在使用Reflector调查此内容后,我发现只有在域上下文发生更改或当前正在保存或加载时才会设置(这是我的情况)。

来自DomainDataSource类

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

在load方法中,您可以看到它如何抛出您正在接收的错误:

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方法的地方。实质上,当有变化时你不能调用load。

答案 1 :(得分:0)

确保您的Datagrid的“List”类型为:ObservableCollection。易于实施并允许此类通知。

如果您需要进一步的帮助,请与我们联系。

答案 2 :(得分:0)

您的两个最佳选择是:(1)使用DomainDataSource.Load()重新加载DDS以获取最新数据;或(2)在使用DomainDataSource.DataView.Add()提交之前,通过DDS添加实体。< / p>

答案 3 :(得分:0)

因此,在遵循@Kyle建议后,我收到以下错误:

当CanLoad为false时,无法执行加载操作。当CanLoad为false时,应禁用调用加载操作的控件

所以我搜索了一下,我发现this post显示了“不太漂亮”的方式来解决这个问题......但它确实可以解决问题。

所以这就是我修复它的方法......

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

所以我所做的就是将数据源重新绑定到我的网格......有人知道更漂亮的方式吗?