Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Сортировка коллекции с помощью ICollectionView работает не корректно / 10 сообщений из 10, страница 1 из 1
29.01.2015, 15:36
    #38866832
monstrilla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка коллекции с помощью ICollectionView работает не корректно
Генерация бага. Клик на айтем в верхнем гриде. В нижний подгрузится коллекция айтемов, которая будет корректно отсортирована (по 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
29.01.2015, 17:34
    #38867001
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка коллекции с помощью ICollectionView работает не корректно
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
29.01.2015, 17:36
    #38867004
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка коллекции с помощью ICollectionView работает не корректно
Roman Mejtes,

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


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

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

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

у DataGrid свой IEditableCollectionView, то есть передавать нужно ObservableCollection, а управлять сортировкой и фильтрацией по средствам встроенной вьюхи Items. Думаю так будет оптимально.
...
Рейтинг: 0 / 0
30.01.2015, 07:46
    #38867368
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка коллекции с помощью ICollectionView работает не корректно
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
30.01.2015, 07:59
    #38867378
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка коллекции с помощью ICollectionView работает не корректно
Сон Веры Павловны,

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

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

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

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


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