我真的被困在尝试使用 MVVM 和 crud 数据网格实现 RIA 服务。我想我错过了一些关键的想法。我见过的所有示例都使用提交按钮或类似按钮将数据发送回客户端。我宁愿在添加/删除/修改一行后立即提交。我想到了几种方法:
- 让我的 IEnuerable Itemsource 属性自动绑定到我的上下文的实体容器。我试过了,但我无法从属性中设置上下文的实体。
- 捕获行更改事件并手动告诉我的上下文已更改项目。考虑到我的 Commodity 属性应该反映数据网格中的变化,这在 MVVM 设计中感觉不对。
此外,我如何告诉 RIA 服务它应该对特定的 crud 操作使用什么方法?这会发生在客户端还是服务器上?
请注意,我使用的是 ComponentOne 数据网格,但对于这个简单的示例,我认为它的行为与普通的 Silverlight 数据网格没有什么不同。
看法:
<c1grid:C1DataGrid x:Name="C1Grid" AutoGenerateColumns="False"
ItemsSource="{Binding Commodities}">
<c1grid:C1DataGrid.Columns>
<c1grid:DataGridTextColumn Binding="{Binding Name, Mode=TwoWay}"></c1grid:DataGridTextColumn>
</c1grid:C1DataGrid.Columns>
</c1grid:C1DataGrid>
视图模型:
public class CommodityViewModel : Model
{
private CommodityContext _context;
private Commodity _selectedCommodity;
public IEnumerable<Commodity> Commodities
{
get { return _context.Commodities;}
//Setter wont work here
}
public CommodityViewModel()
{
_context = new CommodityContext();
_context.Load(_context.GetCommoditiesQuery(), (LoadOperation<Commodity> loadOperation) =>
{
RaisePropertyChanged("Commodities");
_context.Commodities.EntityAdded += Commodities_EntityAdded;
}, null );
}
private void Commodities_EntityAdded(object sender, EntityCollectionChangedEventArgs<Commodity> e)
{
//how does RIA know to use my AddCommodity method on the server side? Where do I set this?
_context.SubmitChanges();
}
}