Я имею небольшой вопрос здесь:Проблемы с CollectionViewSource
В моем коде у меня есть ObservableCollection с некоторыми пунктами:
myCalenderItems = new ObservableCollection<CalendarItem>();
иметь список отсортирован, я создал CollectionViewSource, который я привязан в DataGrid в коде позади:
ICollectionView mySortedCalenderItems = CollectionViewSource.GetDefaultView(myCalenderItems);
mySortedCalenderItems.SortDescriptions.Add(new SortDescription("Day", ListSortDirection.Ascending));
mySortedCalenderItems.SortDescriptions.Add(new SortDescription("Time", ListSortDirection.Ascending));
MainGrid.DataContext = mySortedCalenderItems;
CalendarDataGrid.ItemsSource = mySortedCalenderItems;
Часть XAML для Datagrid выглядит как:
<DataGrid Name="CalendarDataGrid" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" CanUserSortColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Day" ItemsSource="{Binding Source={StaticResource WeekDayEnum}}" Width="*" SelectedValueBinding="{Binding Day, Mode=TwoWay}"/>
<DataGridTextColumn Header="Time" Binding="{Binding Time}" Width="*" IsReadOnly="False"/>
<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*" IsReadOnly="False"/>
</DataGrid.Columns>
<DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
Далее я также хочу, чтобы иметь возможность редактировать значения с помощью других элементов управления рядом с DataGrid, например
<ComboBox Text="{Binding Path=Day}" IsSynchronizedWithCurrentItem="True"/>
А вот где у меня есть проблемы. При изменении дня в datagrid выполняется сортировка, но при изменении его с помощью элемента управления combobox он изменяется в datagrid, но он не пересортирован. (Повторная сортировка выполняется при изменении другого свойства ранее измененного элемента)
У вас есть идеи, что здесь не так?
С уважением
PS: Весь XAML
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:MyProject"
mc:Ignorable="d"
d:DesignHeight="520" d:DesignWidth="840">
<UserControl.Resources>
<ObjectDataProvider x:Key="WeekDayEnum" MethodName="GetValues"
ObjectType="{x:Type System:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:WeekDay"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid x:Name="MainGrid" Grid.Row="0">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="240"/>
<ColumnDefinition Width="180"/>
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Content="Weekly" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<DataGrid x:Name="CalendarDataGrid" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" CanUserSortColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Day" ItemsSource="{Binding Source={StaticResource WeekDayEnum}}" Width="*" SelectedValueBinding="{Binding Day, Mode=TwoWay}" />
<DataGridTextColumn Header="Time" Binding="{Binding Time}" Width="*" IsReadOnly="False"/>
<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*" IsReadOnly="False"/>
</DataGrid.Columns>
</DataGrid>
<Grid Grid.Row="1" Grid.Column="2">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="70"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Content="Day" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0,0,0"/>
<Label Grid.Row="1" Content="Time" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0,0,0"/>
<Label Grid.Row="2" Content="Value" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0,0,0"/>
<ComboBox Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Center" Width="100" Text="{Binding Path=Day}" IsSynchronizedWithCurrentItem="True"/>
<TextBox Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" Width="100" Text="{Binding Path=Time, Mode=TwoWay}"/>
<TextBox Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" Height="23" TextWrapping="Wrap" Width="100" Text="{Binding Path=Value, Mode=TwoWay}"/>
</Grid>
</Grid>
</Grid>
Попробуйте вызвать 'mySortedCalenderItems.Refresh(); 'в событии' SelectionChanged' 'ComboBox' –
Если MainGrid является родителем DataGrid, нет необходимости в CalendarDataGrid.ItemsSource = mySortedCalenderItems; – Maximus
Обновление вызова при событии SelectionChanged дает мне эту ошибку: «Обновить» не разрешено во время транзакции AddNew или EditItem. – b2f