powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Сортировка коллекции с помощью ICollectionView работает не корректно
10 сообщений из 10, страница 1 из 1
Сортировка коллекции с помощью ICollectionView работает не корректно
    #38866832
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Генерация бага. Клик на айтем в верхнем гриде. В нижний подгрузится коллекция айтемов, которая будет корректно отсортирована (по Name). Потом клик на любой другой айтем в верхнем гриде. В нижнем коллекция айтемов подгрузится, но она уже не будет отсортированной! Т.е. отобразится в дефолтном виде, как я ее набил в коде. И уже больше не отсортируется сколько не перевыбирай атем в верхнем гриде. Если посмотреть под отладкой, то коллекция отсортирована, а в окошке нет.

Можно вместо ICollectionView + ObservableCollection использовать обычный список и дергать OnPropertyChanged . Но это как-то не круто.

Win7, .Net 4.0. Просто скопировать код.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <DataGrid Grid.Row="0" 
                  AutoGenerateColumns="False"
                  ItemsSource="{Binding Items}"
                  SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
                  CanUserAddRows="False"
                  CanUserDeleteRows="False"
                  CanUserResizeRows="False"
                  CanUserSortColumns="False"
                  SelectionMode="Single"
                  SelectionUnit="FullRow">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Name}"></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid Grid.Row="1" 
                  AutoGenerateColumns="False"
                  ItemsSource="{Binding SelectedItem.MyCollectionView}"
                  CanUserAddRows="False"
                    CanUserDeleteRows="False"
                    CanUserResizeRows="False"
                    CanUserSortColumns="False"
                    SelectionMode="Single"
                    SelectionUnit="FullRow">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Name}"></DataGridTextColumn>
                <DataGridTextColumn Binding="{Binding Index}"></DataGridTextColumn>
            </DataGrid.Columns>

        </DataGrid>

        <Grid Grid.Row="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <TextBox Grid.Column="0" 
                     Text="{Binding Name1}"></TextBox>
            <TextBox Grid.Column="1" 
                     Text="{Binding Index}"></TextBox>
        </Grid>
    </Grid>




Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
public class TopGridItem
    {
        private ObservableCollection<BottomGridItem> _collection;
        public ObservableCollection<BottomGridItem> Collection
        {
            get { return _collection; }
        }

        public String Name { get; set; }
        
        public ICollectionView MyCollectionView
        {
            get
            {
                ICollectionView _customerView = CollectionViewSource.GetDefaultView(Collection);
                _customerView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));

                return _customerView;
            }
        }

        public TopGridItem()
        {
            _collection = new ObservableCollection<BottomGridItem>();
            _collection.Add(new BottomGridItem { Name = "bbbbbb" });
            _collection.Add(new BottomGridItem { Name = "aaaaa" });
            _collection.Add(new BottomGridItem { Name = "aaaaa" });
            _collection.Add(new BottomGridItem { Name = "ccccc" });
            _collection.Add(new BottomGridItem { Name = "dddddd" });
        }

    }

    public class BottomGridItem
    {
        public String Name { get; set; }
        public String Index { get; set; }
    }

    /// <summary>
    /// Логика взаимодействия для NewWindow.xaml
    /// </summary>
    public partial class ProgressWindow : INotifyPropertyChanged
    {
        public TopGridItem _selectedItem;

        public String Name1 { get; set; }
        public String Index { get; set; }
        public ObservableCollection<TopGridItem> Items { get; set; }

        public TopGridItem SelectedItem 
        {
            get { return _selectedItem; }

            set
            {
                _selectedItem = value;
                OnPropertyChanged("SelectedItem");

            }
        }

        public ProgressWindow()
        {
            InitializeComponent();
            DataContext = this;

            Items = new ObservableCollection<TopGridItem>();
            Items.Add(new TopGridItem {Name = "One"});
            Items.Add(new TopGridItem {Name = "Two"});
            Items.Add(new TopGridItem {Name = "Three"});
        }

        #region INotifyPropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion
    }
...
Рейтинг: 0 / 0
Сортировка коллекции с помощью ICollectionView работает не корректно
    #38867001
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrilla,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    private void ClearSortDescriptionsOnItemsSourceChange()
    {
      this.Items.SortDescriptions.Clear();
      this._sortingStarted = false;
      List<int> descriptionIndices = this.GroupingSortDescriptionIndices;
      if (descriptionIndices != null)
        descriptionIndices.Clear();
      foreach (DataGridColumn dataGridColumn in (Collection<DataGridColumn>) this.Columns)
        dataGridColumn.SortDirection = new ListSortDirection?();
    }

    private static object OnCoerceItemsSourceProperty(DependencyObject d, object baseValue)
    {
      DataGrid dataGrid = (DataGrid) d;
      if (baseValue != dataGrid._cachedItemsSource && dataGrid._cachedItemsSource != null)
        dataGrid.ClearSortDescriptionsOnItemsSourceChange();
      return baseValue;
    }


по всей видимости вот тут происходит сброс сортировки, после 2 изменения

у коллекции Items.SortDesriptions удаляются все элементы...
...
Рейтинг: 0 / 0
Сортировка коллекции с помощью ICollectionView работает не корректно
    #38867004
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

если сделать вот так (после OnPropertyChanged):
Код: c#
1.
DataGridTwo.Items.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));


то сортировка будет :) но это какой то костыль, а дата грид походу индусы писали, какая то лютый код, разбираться лень
...
Рейтинг: 0 / 0
Сортировка коллекции с помощью ICollectionView работает не корректно
    #38867057
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

похоже на то. вот та же шляпа

спс
...
Рейтинг: 0 / 0
Сортировка коллекции с помощью ICollectionView работает не корректно
    #38867091
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrilla,

у DataGrid свой IEditableCollectionView, то есть передавать нужно ObservableCollection, а управлять сортировкой и фильтрацией по средствам встроенной вьюхи Items. Думаю так будет оптимально.
...
Рейтинг: 0 / 0
Сортировка коллекции с помощью ICollectionView работает не корректно
    #38867368
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrillaпохоже на то. вот та же шляпа
И там же указано, как эта шляпа лечится:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public TopGridItem SelectedItem
{
  get { return _selectedItem; }
  set
  {
    _selectedItem = value;
    OnPropertyChanged("SelectedItem");
    _selectedItem.MyCollectionView.Refresh();
  }
}


мне лично не особенно до конца понятно, чем здесь помогает Refresh, но это вполне работает.
...
Рейтинг: 0 / 0
Сортировка коллекции с помощью ICollectionView работает не корректно
    #38867378
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

нефига это не работает, в этом и проблема :)
суть в том, что в DataGrid'е внутри используется IEditableCollectionView
соответственно, там свои дескрипторы сортировки, а при обновлении ItemsSource там какая то индусятина лютая :)
сам вчера пробовал, всякие варианты и Refresh и т.д. Косяк в том, что Refresh будет применяться к ICollectionView и если посмотреть в отладчике, он нормально отсортировано передается в Grid, а вот в гриде , это всё куда то пропадает :(
...
Рейтинг: 0 / 0
Сортировка коллекции с помощью ICollectionView работает не корректно
    #38867381
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesСон Веры Павловны,
нефига это не работает, в этом и проблема :)
Ну здрасте
я вообще-то проверил этот код, прежде чем писать - у меня вполне работает.
...
Рейтинг: 0 / 0
Сортировка коллекции с помощью ICollectionView работает не корректно
    #38867393
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

странно, вообще я в первую очередь способ предложенный Вами попробовал и проблема оставалась. Сейчас перепроверил и всё равно борода, 1 раз сортировка есть, при послед. обновлении 2 грида она пропадает :)
...
Рейтинг: 0 / 0
Сортировка коллекции с помощью ICollectionView работает не корректно
    #38867555
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

У меня, кстати, тоже работает

Код: c#
1.
_selectedItem.MyCollectionView.Refresh();
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Сортировка коллекции с помощью ICollectionView работает не корректно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]