我有一个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
答案 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;
所以我所做的就是将数据源重新绑定到我的网格......有人知道更漂亮的方式吗?