【发布时间】:2011-01-27 19:49:17
【问题描述】:
我正在尝试使用 MVVM 来显示数据网格并在完成编辑行时保存更改。这是数据网格的 XAML:
<data:DataGrid x:Name="discountsDataGrid" ItemsSource="{Binding Discounts, Mode=TwoWay}" MinHeight="200" AutoGenerateColumns="False" SelectedItem="{Binding SelectedDiscount, Mode=TwoWay}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="RowEditEnded">
<i:InvokeCommandAction Command="{Binding SaveChangesCommand}" CommandParameter="{Binding SelectedDiscount}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<data:DataGridTextColumn Header="Discount Amount" Binding="{Binding Amount}" />
</data:DataGrid.Columns>
</data:DataGrid>
这是保存在 ViewModel 上的代码:
public void Save(object parameter){
if (ctx.HasChanges){
((IEditableObject)SelectedDiscount).EndEdit();
ctx.SubmitChanges(SubmitOperation, null);
RaisePropertyChange("Discounts");
}
}
在我有'((IEditableObject)SelectedDiscount).EndEdit();'行之前我将是一个例外,因为没有从数据网格调用结束编辑。由于我试图坚持使用 MVVM,因此视图模型不应该知道显示数据的数据网格。因此,我添加了该行,代码被执行,返回结果显示有修改的条目并且没有发生验证错误。但它从不依赖于数据库。这段代码没有将值完全写回数据库有什么原因吗? ctx 变量只是一个 RIA Services 域服务。在走 MVVM 路线之前,我通常只调用 datagrid.CommitEdit(),但我现在不应该访问它,并且希望对 IEditableObject 的调用能够正常工作。有什么想法吗?
【问题讨论】:
-
不是 100% 确定,因为这是 SL,所以我不会将此作为答案发布,但在 WPF 中,您不需要使用触发器进行任何操作,也不需要任何明确的“保存”方法,因为您的模型将实现 INotifyPropertyChanged,因此通过 DataGridTextColumn 中的值更改的新值将被推送到模型。删除你的触发行为,看看它是否没有按预期工作。
-
如果我删除触发器,什么都不会发生。 :(
-
刚刚注意到RIA引用...应该有模型之间或模型中嵌入的服务,用于将数据推送到后端。
-
这不是 save 命令在做什么,还是你在谈论实际的 IEditableObject ?
-
@Josh 您的模型是否实现了 INotifytProperyChanged?如果是这样,您是否修改了名称,然后查看它是否通过断点或其他方式进入模型上的属性;如果是这样,请将您的保存放在模型中...这会将其推送到数据库,从而消除对触发器/命令的需要。
标签: silverlight data-binding mvvm wcf-ria-services