Двухсторонний шаблон привязки MVVM - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь Пользователю изменить дату в DataGrid внутри DataGrid. Оба являются ObservableCollections.

Вид:

     <DataGrid VerticalContentAlignment="Center" CanUserAddRows="false" Grid.Row="0" Grid.Column="0" ItemsSource="{Binding ItemsCol, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" EnableRowVirtualization="True" AutoGenerateColumns="False" Background="{DynamicResource PrimaryHueMidBrush}" SelectedItem="{Binding Items}" RenderTransformOrigin="0.5,0.5" Style="{DynamicResource MaterialDesignDataGrid}" IsReadOnly="true">
            <DataGrid.Columns>
   ...
   <DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    ...
                            <DataGrid ScrollViewer.CanContentScroll="False" ItemsSource="{Binding PlanList, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" CanUserAddRows="False" VerticalContentAlignment="Bottom" AutoGenerateColumns="false" SelectedItem="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl},Mode=FindAncestor}, Path=DataContext.SelectedPlan}" Background="{DynamicResource PrimaryHueDarkBrush}" Style="{DynamicResource MaterialDesignDataGrid}" IsReadOnly="false">
                                <DataGrid.Columns>
                                    <DataGridTemplateColumn Header="Bearbeitungstag">
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <TextBlock Text="{Binding executeDay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, Mode=OneWay,StringFormat={}{0:dd/MM/yyyy}}"/>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                        <DataGridTemplateColumn.CellEditingTemplate>
                                            <DataTemplate>
                                                <DatePicker SelectedDate="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl},Mode=FindAncestor},Path=DataContext.newexecuteDay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay,StringFormat={}{0:dd/MM/yyyy}}"/>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellEditingTemplate>

                                    </DataGridTemplateColumn>
                                          <DataGridTemplateColumn Header="">
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate >

                                                <Button Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl},Mode=FindAncestor},Path=DataContext.updateOrderCommand}" VerticalAlignment="Center" Style="{DynamicResource MaterialDesignFlatButton}">
                                                    <Viewbox Stretch="Fill">
                                                        <Canvas Width="24" Height="24">
                                                            <Path Data="M15,9H5V5H15M12,19A3,3 0 0,1 9,16A3,3 0 0,1 12,13A3,3 0 0,1 15,16A3,3 0 0,1 12,19M17,3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V7L17,3Z" Fill="{DynamicResource SecondaryAccentBrush}" />
                                                        </Canvas>
                                                    </Viewbox>
                                                </Button>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                    </DataGridTemplateColumn>

                                   ...

                                </DataGrid.Columns>
                            </DataGrid>

ViewModel Команда updateOrderCommand переопределяет выполненный день с новым исполнением и сохраняет его в базе данных. В конце начинается:

CollectionViewSource.GetDefaultView(ItemsCol).Refresh();

И в этот момент код вылетает

System.Windows.Markup.XamlParseException: "" DeferRefresh "....

не допускается во время транзакции AddNew или EditItem (в переводе на русский язык исключение не найдено: - /)

я уже пробовал

CollectionViewSource.GetDefaultView(ItemsCol).DeferRefresh();

Тогда обновление не разрешено. И я попробовал некоторые CodeBehind CommitEdit () и CancelEdit () для первой DataGrid.

Я думаю, что мне нужно прервать режим редактирования внутри пользовательского интерфейса, но как в среде MVVM или RowDetailsTemplate?

...