【问题标题】:Silverlight, MVVM, and datagrid not saving changesSilverlight、MVVM 和数据网格不保存更改
【发布时间】: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


【解决方案1】:

这种方式适合我,我正在使用 SL4 、 mvvm 工具包 3 和 WCF RIA 服务,ds= 域服务

private void guardarFila()
{
IsBusy = true;
ds.SubmitChanges(new Action<submitoperation>(SubmitChangesCompleted), null);
}
private void SubmitChangesCompleted(SubmitOperation args)
{
IsBusy = false;
}

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 2012-10-13
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多