Почему DataGrid WPF ведет себя по-другому при повторной инициализации с идентичным кодом? ⇐ C#
-
Anonymous
Почему DataGrid WPF ведет себя по-другому при повторной инициализации с идентичным кодом?
У меня есть UserControl со следующим Xaml, представляющим простой DataGrid с кнопками для тестирования:
И (в коде программной части) следующий код:
public ListCollectionView TestView {get; набор;} public ObservableCollection TestItems {get; набор;} частная недействительная инициализация() { результат вар = новый ObservableCollection() { новый TestItem() { Id = 1, Name = "First A" }, новый TestItem() { Id = 2, Name = "Second A" }, новый TestItem() { Id = 3, Name = "Третий А" }, }; Тестовые элементы = результат; вар вид = новый ListCollectionView (TestItems); view.SortDescriptions.Add(new SortDescription(nameof(TestItem.Id), ListSortDirection.Descending)); view.IsLiveSorting = правда; view.Filter = o => (o как TestItem)?.Name.Contains("A") ?? ЛОЖЬ; ТестПросмотр = просмотр; } частный void InitViewButton_Click (отправитель объекта, RoutedEventArgs e) { в этом(); TestGrid.ItemsSource = TestView; TestGrid.Items.Обновить(); } частная пустота AddButton_Click (отправитель объекта, RoutedEventArgs e) { вар элемент = новый TestItem () {Id = 99, Имя = «Новый AX» }; TestItems.Add(элемент); } частная пустота ChangeIdButton_Click (отправитель объекта, RoutedEventArgs e) { foreach (var testItem в TestItems) { testItem.Id = Random.Shared.Next(1000); } } частный void FilterButton_Click (отправитель объекта, RoutedEventArgs e) { TestView.Filter = o => (o как TestItem)?.Name.Contains("X") ?? ЛОЖЬ; } После нажатия кнопки «Init View» DataGrid заполняется, как ожидалось, а другие кнопки работают как положено, например при изменении идентификаторов строки сортируются.
Если я затем снова нажму «Init View», все будет в порядке, за исключением повторной сортировки, т. е. изменение идентификаторов не приводит к сортировке строк - однако отображаемые элементы обновляются правильно.
Как такое может быть?
Примечание: несмотря на то, что IsLiveFiltering не установлен, фильтрация работает должным образом, например если я удалю букву «А» из имени, элемент будет удален из DataGrid.
У меня есть UserControl со следующим Xaml, представляющим простой DataGrid с кнопками для тестирования:
И (в коде программной части) следующий код:
public ListCollectionView TestView {get; набор;} public ObservableCollection TestItems {get; набор;} частная недействительная инициализация() { результат вар = новый ObservableCollection() { новый TestItem() { Id = 1, Name = "First A" }, новый TestItem() { Id = 2, Name = "Second A" }, новый TestItem() { Id = 3, Name = "Третий А" }, }; Тестовые элементы = результат; вар вид = новый ListCollectionView (TestItems); view.SortDescriptions.Add(new SortDescription(nameof(TestItem.Id), ListSortDirection.Descending)); view.IsLiveSorting = правда; view.Filter = o => (o как TestItem)?.Name.Contains("A") ?? ЛОЖЬ; ТестПросмотр = просмотр; } частный void InitViewButton_Click (отправитель объекта, RoutedEventArgs e) { в этом(); TestGrid.ItemsSource = TestView; TestGrid.Items.Обновить(); } частная пустота AddButton_Click (отправитель объекта, RoutedEventArgs e) { вар элемент = новый TestItem () {Id = 99, Имя = «Новый AX» }; TestItems.Add(элемент); } частная пустота ChangeIdButton_Click (отправитель объекта, RoutedEventArgs e) { foreach (var testItem в TestItems) { testItem.Id = Random.Shared.Next(1000); } } частный void FilterButton_Click (отправитель объекта, RoutedEventArgs e) { TestView.Filter = o => (o как TestItem)?.Name.Contains("X") ?? ЛОЖЬ; } После нажатия кнопки «Init View» DataGrid заполняется, как ожидалось, а другие кнопки работают как положено, например при изменении идентификаторов строки сортируются.
Если я затем снова нажму «Init View», все будет в порядке, за исключением повторной сортировки, т. е. изменение идентификаторов не приводит к сортировке строк - однако отображаемые элементы обновляются правильно.
Как такое может быть?
Примечание: несмотря на то, что IsLiveFiltering не установлен, фильтрация работает должным образом, например если я удалю букву «А» из имени, элемент будет удален из DataGrid.
Мобильная версия