powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / как присоединить DataGrig & коллекцию при сортировке?
7 сообщений из 7, страница 1 из 1
как присоединить DataGrig & коллекцию при сортировке?
    #39308752
Света7415
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!

Надеюсь, что мой вопрос будет полезен не только мне, но и всем...
И так, имею:
- MVVM
- коллекция:
Код: c#
1.
public class SynchronizedBindableCollection<T> : IList<T>, IList, INotifyCollectionChanged, INotifyPropertyChanged

- DataGrid:
Код: xml
1.
ItemsSource="{Binding Names, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"

при этом Names это коллекция

Теперь вопрос, как синхронизировать (EventTrigger EventName="Sorting") DataGrid и коллекцию?

Заранее спасибо
...
Рейтинг: 0 / 0
как присоединить DataGrig & коллекцию при сортировке?
    #39308888
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Света7415Привет всем!

Надеюсь, что мой вопрос будет полезен не только мне, но и всем...
И так, имею:
- MVVM
- коллекция:
Код: c#
1.
public class SynchronizedBindableCollection<T> : IList<T>, IList, INotifyCollectionChanged, INotifyPropertyChanged

- DataGrid:
Код: xml
1.
ItemsSource="{Binding Names, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"

при этом Names это коллекция

Теперь вопрос, как синхронизировать (EventTrigger EventName="Sorting") DataGrid и коллекцию?

Заранее спасибо
в DataGrid сортировка работает через ICollectionView , для каждой коллекции, которая связывается с UI создается своя View,
получить её можно 2 путями:
А) создать самому и связать ItemsControl.ItemsSource с это View (в данным случае подходит класс ListCollectionView (он создается по умолчанию для Collection.
Б) запросить его через метод CollectionViewSource.GetDefaultView(IEnumerable collection)
В) если коллекция своя, можно указать явный View который ты хочешь. чтоб создавался для твоей коллекции, это можно сделать наследую в классе коллекции ICollectionViewFactory.
Но есть 1 минус, требуется сборка WindowBase, которая относится к UI, а не к VM.

чтоб переопределить сортировку, самый простой способ это создать своё вью на базе ListCollectionView (создавать свою View, довольно сложный и ресурсоёмкий процесс требующий глубоко понимания, как всё работает). В классе есть SortDefinitions свойство коллекция, у которой есть события CollectionChanged или что то подобное, оно там одно. Именно этим механизмом пользуется DataGrid для управления сортировки.
Компаратор для сортировки создается внутри UI и работает через рефлексию
...
Рейтинг: 0 / 0
как присоединить DataGrig & коллекцию при сортировке?
    #39308892
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
сори, спросони начудил
fixed:
- Компаратор для сортировки создается внутри View и работает через рефлексию
- (создавать свою View с нуля, довольно сложный и ресурсоёмкий процесс требующий глубоко понимания, как всё работает)
...
Рейтинг: 0 / 0
как присоединить DataGrig & коллекцию при сортировке?
    #39308958
Света7415
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,
простите, не поняла.. я эту проблему решила, но через "пятую точку", если не говорить грубее:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
            ReSort = new Command(objNames =>
            {
                if (objNames == null || !IsEnabled)
                    return;
                var names = objNames as ItemCollection;
                if (names == null || names.Count == 0)
                    return;
                var buffer = new SynchronizedBindableCollection<FullName>(
                    new ObservableCollection<FullName>());
                int count = Names.Count;
                for (int i = 0; i < count; i++)
                {
                    var item = ((FullName) names[i]).Clony();
                    buffer.Add(item);
                    //Names.Remove(Names.Single(y => y.Id == item.Id));
                }
                Names = buffer;
            });

понимаю, что на маленьких данных это ОК, а на больших тупёжь(((
...
Рейтинг: 0 / 0
как присоединить DataGrig & коллекцию при сортировке?
    #39308965
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Света7415Roman Mejtes,
простите, не поняла.. я эту проблему решила, но через "пятую точку", если не говорить грубее:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
            ReSort = new Command(objNames =>
            {
                if (objNames == null || !IsEnabled)
                    return;
                var names = objNames as ItemCollection;
                if (names == null || names.Count == 0)
                    return;
                var buffer = new SynchronizedBindableCollection<FullName>(
                    new ObservableCollection<FullName>());
                int count = Names.Count;
                for (int i = 0; i < count; i++)
                {
                    var item = ((FullName) names[i]).Clony();
                    buffer.Add(item);
                    //Names.Remove(Names.Single(y => y.Id == item.Id));
                }
                Names = buffer;
            });

понимаю, что на маленьких данных это ОК, а на больших тупёжь(((
я не очень понимаю в чем ваша проблема? DataGrid из коробочки поддерживает сортировку, в каком момент требуется обновить эту сортировку и каким образом?
Для обновления сортировки, достаточно вызвать метод

Код: c#
1.
2.
3.
4.
var view = CollectionViewSource.GetDefaultView(observableCollection);
view.SortDefenitions.Add(new SortDefenition("Свойство", направление сортировки));
view.SortDefenitions.Remove(new SortDefenition("Свойство", направление сортировки));
view.Refresh();


после Refresh порядок элементов (по строкам) в DataGrid изменится согласно параметрам сортировки в SortDefenitions,
заголовки столбцов DataGrid поддерживают добавление и удаление из view.SortDefenitions нужных полей на уровне контрола и его шаблона. Но можно всё это задать и руками, при чем доступно это как из View, так и из ViewModel.
CollectionViewSource.GetDefaultView(..) всегда будет возвращать один и тот же класс наследованный от ICollectionView, для заданной коллекции.
...
Рейтинг: 0 / 0
как присоединить DataGrig & коллекцию при сортировке?
    #39309013
Света7415
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,
Не совсем то((( Сортировка по умолчанию устраивает, нужно, чтоб после того, как пользователь кликнул по колонке изменилась и коллекция, из которой DataGrid получает ресурсы.
Я совсем тупая? даже объяснить не могу
...
Рейтинг: 0 / 0
как присоединить DataGrig & коллекцию при сортировке?
    #39309037
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Света7415Roman Mejtes,
Не совсем то((( Сортировка по умолчанию устраивает, нужно, чтоб после того, как пользователь кликнул по колонке изменилась и коллекция, из которой DataGrid получает ресурсы.
Я совсем тупая? даже объяснить не могу
для того, чтоб получить результирующую коллекцию (сортированную так как она отображается в DataGrid) достаточно перечислять View, но нужно учитывать 1 момент, что при перечислении view, учитывает фильтр и еще в нём могут присутствовать элементы вставки.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / как присоединить DataGrig & коллекцию при сортировке?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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