powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / c# wpf datagridviewcomboboxcolumn itemssource фильтрация
7 сообщений из 7, страница 1 из 1
c# wpf datagridviewcomboboxcolumn itemssource фильтрация
    #39132334
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Нужна помощь по двум задачам!

Первая задача такая: я использую DataGrid, в котором я из кода создаю поля для работы со справочником. Данный справочник, для многих покажется не совсем корректным, так как многие посчитают разделить его на два справочника (Улица + Дом) и (Дом + Квартира), но для меня важно другое. Мне нужно понять возможны ли выполнять фильтрацию в выпадающих списках.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
new DataGridComboBoxColumn
{
     Header = "Улица",
     DisplayMemberPath = "Value",
     SelectedValuePath = "Key",
     SelectedValueBinding = "Street",
     ItemsSource = DbContext.Set<Streets>().ToDictionary(d => d.Id, d => d.Name).ToList()
},
new DataGridComboBoxColumn
{
     Header = "Дом",
     DisplayMemberPath = "Value",
     SelectedValuePath = "Key",
     SelectedValueBinding = "House",
     ItemsSource = DbContext.Set<Houses>().ToDictionary(d => d.Id, d => d.Name).ToList()
     //ItemsSource = DbContext.Set<Houses>().Where(w => w.StreetId == 777).ToDictionary(d => d.Id, d => d.Name).ToList()
},
new DataGridTextColumn 
{
     Header = "Номер квартиры", 
     Binding = "Room"}


В коде выше я представил пример, в данном примере имеется комментирования строчка, которая выполняет фильтрацию выпадающего списка "Дом", в зависимости от выбранной улицы (для простоты я просто указал Id равный 777). Данный способ действительно делает фильтрацию, но и при этом усекает данные в самом DataGrid, отображая только то что имеется в справочнике.
Так то принципе это правильно, но хотелось бы узнать экспертное мнение. Можно ли выдавать фильтрованный список, не усекая данные в DataGrid???

Второй вопрос касается каретки. Как можно запретить создавать более одной новой строки, при нажатии на Enter?
...
Рейтинг: 0 / 0
c# wpf datagridviewcomboboxcolumn itemssource фильтрация
    #39132353
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Nechto]Здравствуйте!
Нужна помощь по двум задачам!

Первая задача такая: я использую DataGrid, в котором я из кода создаю поля для работы со справочником. Данный справочник, для многих покажется не совсем корректным, так как многие посчитают разделить его на два справочника (Улица + Дом) и (Дом + Квартира), но для меня важно другое. Мне нужно понять возможны ли выполнять фильтрацию в выпадающих списках.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
new DataGridComboBoxColumn
{
     Header = "Улица",
     DisplayMemberPath = "Value",
     SelectedValuePath = "Key",
     SelectedValueBinding = "Street",
     ItemsSource = DbContext.Set<Streets>().ToDictionary(d => d.Id, d => d.Name).ToList()
},
new DataGridComboBoxColumn
{
     Header = "Дом",
     DisplayMemberPath = "Value",
     SelectedValuePath = "Key",
     SelectedValueBinding = "House",
     ItemsSource = DbContext.Set<Houses>().ToDictionary(d => d.Id, d => d.Name).ToList()
     //ItemsSource = DbContext.Set<Houses>().Where(w => w.StreetId == 777).ToDictionary(d => d.Id, d => d.Name).ToList()
},
new DataGridTextColumn 
{
     Header = "Номер квартиры", 
     Binding = "Room"}


Для 2 списка нужно использовать ListCollectionView с фильтром по значению из колонки Улица. При каждом изменении колонки Улица нужно рефрешить этот View
...
Рейтинг: 0 / 0
c# wpf datagridviewcomboboxcolumn itemssource фильтрация
    #39132590
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем понял как правильно применять ListCollectionView.
Делаю следующим образом:

Код: 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.
// Конструктор
public DictHouseModel()
{
     D = (ListCollectionView) CollectionViewSource.GetDefaultView(DbContext.Set<Houses>()
            ToDictionary(d => d.Id, d => d.Name)
            .ToList());            
}

//Событие при изменении улицы
public void ReloadDicts()
{
     D.Filter = _Filter;
}
private bool _Filter(object item) 
{
     var p = (KeyValuePair<int, string>) item;
     return DbContext.Set<Houses>().Any(w => w.StreetId == 777); // Для примера выбираю тот же id 777
}
private ListCollectionView _bsDictHouse;

// ------------------------------------------------------------------

new DataGridComboBoxColumn
{
     Header = "Улица",
     DisplayMemberPath = "Value",
     SelectedValuePath = "Key",
     SelectedValueBinding = "Street",
     ItemsSource = DbContext.Set<Streets>().ToDictionary(d => d.Id, d => d.Name).ToList()
},
new DataGridComboBoxColumn
{
     Header = "Дом",
     DisplayMemberPath = "Value",
     SelectedValuePath = "Key",
     SelectedValueBinding = "House",
     ItemsSource = _bsDictHouse
     //ItemsSource = DbContext.Set<Houses>().Where(w => w.StreetId == 777).ToDictionary(d => d.Id, d => d.Name).ToList()
},
new DataGridTextColumn 
{
     Header = "Номер квартиры", 
     Binding = "Room"}



В итоге справочник фильтруется, но и данные в DataGrid в колонке "Дом" усекаются согласно фильтрации. Может я ListCollectionView не так применяю?
...
Рейтинг: 0 / 0
c# wpf datagridviewcomboboxcolumn itemssource фильтрация
    #39132591
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю перепост.

Не совсем понял как правильно применять ListCollectionView.
Делаю следующим образом:

Код: 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.
// Конструктор
public DictHouseModel()
{
     D = (ListCollectionView) CollectionViewSource.GetDefaultView(DbContext.Set<Houses>()
            ToDictionary(d => d.Id, d => d.Name)
            .ToList());            
}

//Событие при изменении улицы
public void ReloadDicts()
{
     D.Filter = _Filter;
}
private bool _Filter(object item) 
{
     return DbContext.Set<Houses>().Any(w => w.StreetId == 777); // Для примера выбираю тот же id 777
}
private ListCollectionView D;

// ------------------------------------------------------------------

new DataGridComboBoxColumn
{
     Header = "Улица",
     DisplayMemberPath = "Value",
     SelectedValuePath = "Key",
     SelectedValueBinding = "Street",
     ItemsSource = DbContext.Set<Streets>().ToDictionary(d => d.Id, d => d.Name).ToList()
},
new DataGridComboBoxColumn
{
     Header = "Дом",
     DisplayMemberPath = "Value",
     SelectedValuePath = "Key",
     SelectedValueBinding = "House",
     ItemsSource = D
     //ItemsSource = DbContext.Set<Houses>().Where(w => w.StreetId == 777).ToDictionary(d => d.Id, d => d.Name).ToList()
},
new DataGridTextColumn 
{
     Header = "Номер квартиры", 
     Binding = "Room"}




В итоге справочник фильтруется, но и данные в DataGrid в колонке "Дом" усекаются согласно фильтрации. Может я ListCollectionView не так применяю?
...
Рейтинг: 0 / 0
c# wpf datagridviewcomboboxcolumn itemssource фильтрация
    #39132623
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если это не сильверлайт, то не берите по умолчанию View'ху, а создайте свою new ListCollectionView(IList)
...
Рейтинг: 0 / 0
c# wpf datagridviewcomboboxcolumn itemssource фильтрация
    #39133059
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesесли это не сильверлайт, то не берите по умолчанию View'ху, а создайте свою new ListCollectionView(IList)

Нет не силверлайт. Обычный Wpf проект, с использование telerik.

Свой new ListCollectionView(IList), это вместо CollectionViewSource.GetDefaultView(DbContext.Set<Houses>()
...
Рейтинг: 0 / 0
c# wpf datagridviewcomboboxcolumn itemssource фильтрация
    #39133435
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

ну да, конечно, не забывайте, что когда строка меняется должно меняться свойство фильтра и список должен обновляться
практически в 99% случаев на View модель у меня торчат только ListCollectionView классы, самое прикольное в этом то, что ItemsControl проверяет свойство ItemsSource, если оно наследует ICollectionView то используется именно это представление, если не наследует, то берется ICollectionView по умолчанию для объекта из ItemsSource.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / c# wpf datagridviewcomboboxcolumn itemssource фильтрация
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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