Data binding 当我将RIA服务添加到组合中时,SL4中的双向绑定停止工作。解决方案

Data binding 当我将RIA服务添加到组合中时,SL4中的双向绑定停止工作。解决方案,data-binding,binding,silverlight-4.0,wcf-ria-services,Data Binding,Binding,Silverlight 4.0,Wcf Ria Services,环境:VS2010、SL4、RIA服务 我有一个SL4UI,是针对从XML文件实例化的数据对象开发的(这样我在前端工作时就不必担心应用程序的后端)。在这个UI中,我有一个数据网格,显示数据集合中每个对象的属性。我还有一个详细信息面板,显示datagrid中所选对象的可编辑详细信息 在这个使用“模拟”数据的版本中,我将可编辑属性的绑定设置为双向。当我在“详细信息”面板中编辑值时,数据网格中的相应值将更新。(我不允许直接在网格中编辑。)我可以移动到另一条记录,然后返回到我更改的记录,我可以看到值已成

环境:VS2010、SL4、RIA服务

我有一个SL4UI,是针对从XML文件实例化的数据对象开发的(这样我在前端工作时就不必担心应用程序的后端)。在这个UI中,我有一个数据网格,显示数据集合中每个对象的属性。我还有一个详细信息面板,显示datagrid中所选对象的可编辑详细信息

在这个使用“模拟”数据的版本中,我将可编辑属性的绑定设置为双向。当我在“详细信息”面板中编辑值时,数据网格中的相应值将更新。(我不允许直接在网格中编辑。)我可以移动到另一条记录,然后返回到我更改的记录,我可以看到值已成功更改(至少在客户端)

然后,我将RIA服务添加到混合中,以便现在从后端检索数据。数据加载很好,但当我尝试在“详细信息”面板中修改属性的值时,它不会“粘住”。也就是说,数据网格中的值不会更新以反映新值,如果我移动到另一个记录并返回到已更改的记录,则会显示旧值。
由于RIA服务是改变的东西,我认为这就是问题所在。
下一步。。。我在RIA服务生成的用于客户端消费的代码中为我正在更改的值设置了一个断点。首次加载数据时,生成的setter中的代码工作正常。但是,当我更改属性时,似乎出现了问题

下面是setter中生成的代码:

        set 
        { 
            if ((this._quantity != value)) 
            { 
                this.OnQuantityChanging(value); 
                this.RaiseDataMemberChanging("Quantity"); 
                this.ValidateProperty("Quantity", value); 
                this._quantity = value; 
                this.RaiseDataMemberChanged("Quantity"); 
                this.OnQuantityChanged(); 
            } 
        }
更改数据后,我在调试器中逐步执行上述代码。当我执行“RAISEDATAMBERCHANGING…”行时,setter退出,其余语句不执行。没有引发异常,应用程序将继续,但该值不会更新,因为setter中实际设置该值的代码行似乎没有执行

关于问题是什么(或者至少我下一步应该尝试什么)有什么想法吗

以下是一些可能有用的附加信息:

编辑在“详细信息”面板的文本框中进行。以下是文本框的Xaml:

<TextBox Grid.Row="2" Grid.Column="0" Text="{Binding Quantity, Mode=TwoWay}" />
下面是使用RIA服务的绑定代码。注意,服务器端有一个IndustrialDetailsService,RIA服务从中生成IndustrialDetailsContext

        _industrialDetailsContext = new IndustrialDetailsContext(); 
        _industrialDetailsContext.Load<IndustrialDetailDto>(_industrialDetailsContext.GetByFacilityAndAssessmentYearQuery(202, 2009), 
            loadOperation => 
            { 
                _industrialDetailsView = new PagedCollectionView(loadOperation.Entities); 
                grid.ItemsSource = _industrialDetailsView; 
            }, null);The data context for the details panel has not changed.  It is set from the data grid's SelectionChanged event handler like so:
            IndustrialDetailDto industrialDetails = (IndustrialDetailDto)grid.SelectedItem; 
            DetailsView.DataContext = industrialDetails;
\u industrialDetailsContext=新的industrialDetailsContext();
_industrialDetailsContext.Load(_industrialDetailsContext.GetByFacilityAndAssessmentYearQuery(2022009),
loadOperation=>
{ 
_industrialDetailsView=新页面集合视图(loadOperation.Entities);
grid.ItemsSource=\u IndustrialDetails视图;
},空);“详细信息”面板的数据上下文未更改。它是从数据网格的SelectionChanged事件处理程序设置的,如下所示:
IndustrialDetailDto industrialDetails=(IndustrialDetailDto)grid.SelectedItem;
DetailsView.DataContext=industrialDetails;

如果有其他有用的信息,请告诉我

当我使datagrid可编辑并尝试直接在datagrid中更改值时,我最终确定了问题的性质。当我这样做时,我收到一条错误消息,上面说:

“此类型为“X”的EntitySet不支持“编辑”操作。”

然后,我可以通过向域服务添加占位符方法来解决这个问题,用于“删除”、“插入”和“更新”,以便生成的EntitySet允许编辑

尽管如此,我仍然认为这是一个需要微软解决的问题。。。当我试图修改文本框而不是过早退出setter时,我应该收到一条错误消息。

        InitializeComponent(); 
        _industrialDetailsView = new PagedCollectionView((IEnumerable)IndustrialDetailsData.DataSource); 
        grid.ItemsSource = _industrialDetailsView;
        _industrialDetailsContext = new IndustrialDetailsContext(); 
        _industrialDetailsContext.Load<IndustrialDetailDto>(_industrialDetailsContext.GetByFacilityAndAssessmentYearQuery(202, 2009), 
            loadOperation => 
            { 
                _industrialDetailsView = new PagedCollectionView(loadOperation.Entities); 
                grid.ItemsSource = _industrialDetailsView; 
            }, null);The data context for the details panel has not changed.  It is set from the data grid's SelectionChanged event handler like so:
            IndustrialDetailDto industrialDetails = (IndustrialDetailDto)grid.SelectedItem; 
            DetailsView.DataContext = industrialDetails;