Silverlight, MVVM и сетка данных не сохраняют изменения - PullRequest
0 голосов
/ 27 января 2011

Я пытаюсь использовать 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 будет работать. Есть идеи?

1 Ответ

1 голос
/ 28 апреля 2011

у меня этот способ работает, я использую SL4, mvvm toolkit 3 и службы WCF RIA, ds = служба домена

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