Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/82: Рейтинг темы: голосов - 82, средняя оценка - 4.51
3 / 4 / 0
Регистрация: 19.09.2016
Сообщений: 91
WPF

Фильтрация DataGrid через ComboBox

10.07.2019, 07:56. Показов 17893. Ответов 37

Студворк — интернет-сервис помощи студентам
Доброе время! Изучая WPF и MVVM я столкнулся с задачей, с решением которой не хватает знаний. Суть в следующем:
Приложение работает с некими товарами и определены они в Product для БД и затем в ProductVM для работы с View. Во вьюшке товары выгружаются в DataGrid. В ComboBox выводится наименование поставщиков. Задача состоит в том чтобы при выборе в ComboBox-е поставщика, в DataGrid выводились только товары у которых выбранный поставщик.
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
    <ComboBox  Name="Supliers"  Width="200"
                                      
                   SelectedItem="{Binding SupplierVm, Mode=OneWayToSource}"
                   ItemsSource="{Binding supplierInfo}"
                   DisplayMemberPath="Supplier_Name"
                   SelectedIndex="0" 
                   SelectedValuePath="id" 
                   IsEditable="True"
                   IsReadOnly="True">
 
        </ComboBox>
 
 
        <GroupBox  Grid.Row="1" >
 
            <DataGrid AutoGenerateColumns="False" x:Name="productGrid" ItemsSource="{Binding ProductVM}" >
                <DataGrid.Columns>
 
                    <DataGridTextColumn Binding="{Binding Model}" Header="Модель" />
                    <DataGridTextColumn Binding="{Binding  Art}" Header="Артикул" Width="100"/>
                    <DataGridTextColumn Binding="{Binding Supplier}" Header="Поставщик" />
                    <DataGridTextColumn Binding="{Binding Category}" Header="Категория" />
                    <DataGridTextColumn Binding="{Binding Manufacturer}" Header="Производитель" />
                    <DataGridTextColumn Binding="{Binding Price}" Header="Цена" Width="70"/>
                    <DataGridTextColumn Binding="{Binding Currecurrency}" Header="Валюта" Width="70"/>
 
                </DataGrid.Columns>
            </DataGrid>
 
        </GroupBox>
Добавлено через 6 минут
Весь пример можно скачать тут https://yadi.sk/d/tkd2d6Yn54eLIQ
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.07.2019, 07:56
Ответы с готовыми решениями:

Фильтрация DataGrid
Ребят подскажите пожалуйста как сделать фильтрацию в DataGrid, в winform было все просто в две строчки, что то типо того: ...

Фильтрация данных в WPF DataGrid
Помогите пожалуйста отфильтровать данные в DataGrid. &lt;Window.Resources&gt; &lt;my:SpringsDataSet x:Key=&quot;springsDataSet&quot; /&gt; ...

Фильтрация в DataGrid по данным из TextBox или CheckBox
Подскажите как сделать фильтрацию с помощью чекбокса или текстбокса? данные в DataGrid идут с sql Раньше делал в C# просто ...

37
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
23.07.2019, 15:07
Лучший ответ Сообщение было отмечено AII как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от AII Посмотреть сообщение
Да, планирую редактирование, сохранение и удаление производить другими кнопками.
Тогда точно DataGrid не подходит.

P.S И посмотрите как работает CollectionViewSource - в ней осуществляется автоматическая динамическая фильтрация. Изменив название поставщика продукта - это продукт сразу будет автоматически фильтроваться.
1
3 / 4 / 0
Регистрация: 19.09.2016
Сообщений: 91
23.07.2019, 15:54  [ТС]
Спасибо огромное, за Ваш ответ, очень помогли, я немного взглянул на свой код с другой стороны. Мне раньше казалось что вся работа должна быть сосредоточена в VM. И соответственно события происходящие в самой форме я совсем не рассматривал. А так же думал что в CB окна, по большому счету вообще ничего не должно быть ))). А так то в принципе, мы не трогаем остальные уровни, а просто форма работает с теми данными которые у неё есть.

Добавлено через 8 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Тогда точно DataGrid не подходит.
А что вместо грида использовать лучше?
0
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
23.07.2019, 16:14
Для решения твоей задачи у тебя уже все есть.
Просто добавить пару строчек кода в VM
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 public SupplierVM SupplierVm
      {
         get { return _supplierVm; }
         set
         {
            _supplierVm = value;
 
            if ( value?.Supplier_Name == "Все" )
               ProductVM = GetProduct ();
            else
               ProductVM = GetProduct ().Where ( product => product.Supplier == value?.Supplier_Name );
         }
      }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
23.07.2019, 16:41
Цитата Сообщение от AII Посмотреть сообщение
А так же думал что в CB окна, по большому счету вообще ничего не должно быть ))). А так то в принципе, мы не трогаем остальные уровни, а просто форма работает с теми данными которые у неё есть.
В CB не должно быть методов работающих с данными. И, конечно, его стоит использовать только если не хватает возможностей XAML. В основном это события к которым нельзя привязать команду, или эта привязка неэффективна.

Так же в CB можно прописать кое-какую логику работы View. Допустим, команда кнопки привязана к свойству VM, а Click обрабатывается внутри View для изменения отображения каких-то элементов.

Но надо стремиться к тому, чтобы CB меньше загружать. По возможности всё реализовывать в XAML.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
23.07.2019, 16:43
Цитата Сообщение от AII Посмотреть сообщение
А что вместо грида использовать лучше?
Если "шапки" колонок не нужны и не нужно выделение - ItemsControl
Если нужно выделение - ListBox
Если нужны шапки - ListView
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
23.07.2019, 16:54
Цитата Сообщение от AII Посмотреть сообщение
я немного взглянул на свой код с другой стороны
Взгляните ещё дальше.

Создание решения начинается с проектирования его архитектуры. На этом этапе определяется общее ТЗ и ТЗ к каждой части приложения. Чем подробнее и детальнее будут составлены эти ТЗ тем проще будет потом их реализовывать и меньше потребуется переделок.

Ещё такой совет, на начальном этапе обучения, лучше раздельные части решения делать не в отдельных папках, а в отдельных проектах. Вам тогда будет проще понять границы видимостей типов и данных.

Начинать делать решение надо с Model. Её надо полностью реализовать и отладить в КОНСОЛЬНОМ приложении. Перед созданием View необходимо определить интерфейс VM и реализовать его в виде Контекста Данных Времени Разработки. Я его обычно реализую как VM времени разработки - VMDD. Это сильно облегчает создание View и позволяет её отлаживать независимо от Model.

Добавлено через 1 минуту
P.S. Прочитайте темы из Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп] Там есть и подробная реализация готовых WPF+MVVM решений.
0
3 / 4 / 0
Регистрация: 19.09.2016
Сообщений: 91
24.07.2019, 06:18  [ТС]
Большое спасибо, за помощь и за такой развернутый ответ. К сожалению, когда самостоятельно изучаешь какую то обширную и достаточно сложную область, особенно программирование, то как слепой тыркаешься в разные стороны пытаясь ухватиться за любую твердую поверхность или ориентир. Документация очень какая то скудная. По этому Ваши советы очень важны. Еще раз спасибо!

Добавлено через 11 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ещё такой совет, на начальном этапе обучения, лучше раздельные части решения делать не в отдельных папках, а в отдельных проектах. Вам тогда будет проще понять границы видимостей типов и данных.
Начинать делать решение надо с Model. Её надо полностью реализовать и отладить в КОНСОЛЬНОМ приложении. Перед созданием View необходимо определить интерфейс VM и реализовать его в виде Контекста Данных Времени Разработки. Я его обычно реализую как VM времени разработки - VMDD. Это сильно облегчает создание View и позволяет её отлаживать независимо от Model.
Да. В принципе, я уже до этого и сам догадался. На самом деле тот пример который мы тут разбирали, этот пример я выдернул из большого моего приложения, для упрощения видимости проблемы, с которой я столкнулся изучая WPF и MVVM. Большой проект я уже в принципе написал все что нужно для основной работы приложения, на консольке. И начал было писать приложение используя формы по шаблону MVP. Но мне посоветовали все таки изучить и использовать WPF. Вот уже несколько месяцев я пытаюсь познать WPF.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
24.07.2019, 08:26
Цитата Сообщение от AII Посмотреть сообщение
Документация очень какая то скудная.
Документации то хватает, а вот что касается учебников - то скудновато. Они есть, но их мало и написаны они все очень похоже, по одному шаблону. А некоторым нужно объяснение несколько под другим углом, ракурсом. Каждый человек всё таки индивидуален и объяснение понятное одному, может быть непонятным для другого. Вот этого разнообразия в учебниках и не хватает.

Я сам пытался несколько раз читать учебники, но.... Для меня проще оказалось METANIT, professorweb, MSDN и документация MS. По ним и учился. Начал освоение C# и WPF меньше года назад. До этого знал только их названия.

Добавлено через 4 минуты
Цитата Сообщение от AII Посмотреть сообщение
Но мне посоветовали все таки изучить и использовать WPF.
Это правильный совет. WPF может и не глобальная платформа, но в ней используются более-менее современные подходы к дизайну окна, элементов, связей между частями приложений. Освоение WPF сильно поможет освоению других современных платформ.
А вот опыт WF, по моим наблюдениям, не просто будет лежать балластом, а будет даже негативно влиять на освоение современных платформ.

Добавлено через 59 секунд
Цитата Сообщение от AII Посмотреть сообщение
Вот уже несколько месяцев я пытаюсь познать WPF
Обращайтесь на форум с вопросами - помогут освоить.
0
3 / 4 / 0
Регистрация: 19.09.2016
Сообщений: 91
24.07.2019, 08:35  [ТС]
Спасибо!
0
1 / 1 / 1
Регистрация: 19.12.2016
Сообщений: 153
12.10.2021, 19:49
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
2) Фильтрация выводимого списка никак не связана с фильтрацией самих данных из БД. Это нужно только для View. Поэтому лучше всего её настроить через CollectionViewSource.
Можно это сделать в XAML и CB окна.
по Вашему примеру делаю фильтрацию. У меня виснет View. из-за чего может быть?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
12.10.2021, 21:34
Цитата Сообщение от marat1905 Посмотреть сообщение
У меня виснет View. из-за чего может быть?
Список большой?
0
1 / 1 / 1
Регистрация: 19.12.2016
Сообщений: 153
13.10.2021, 06:03
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Список большой?
Нет не большой, там всего две строчки на начальном этапе но со временем этот список станет большой. когда идет фильтрация
Цитата Сообщение от Элд Хасп Посмотреть сообщение
e.Accepted = true;
сразу виснет View

Добавлено через 3 минуты
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
 private void CollectionViewSource_FilterLogs(object sender, FilterEventArgs e)
        {
 
            var obj = e.Item as LogsViewModel;
            if (obj != null)
            {
                Text_all.Content = null;
                if (Text_filterLogs != null)
                {
                    if (obj.Mesto == Text_filterLogs)
                    {
                        if (obj.Comentariy != null)
                        {
                            
                            try
                            {
                                Text_count = text_count + 1;
                                Text_decimal = Text_decimal + Convert.ToDecimal(obj.Comentariy);
                                Text_all.Content = "Кол-во: " + text_count + "; Счет: " + Math.Round(text_decimal, 2);
                            }
                            catch (Exception)
                            {
 
 
                            }
                        }
                        e.Accepted = true;
                    }
                    else
                    {
                       e.Accepted = false;
                     
                    }
                }
                else
                {
                     e.Accepted = true;
                    Text_all.Content = "";
                }
            }
            else
            {
                e.Accepted = true;
                Text_all.Content = "";
            }
 
        }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
13.10.2021, 12:14
Цитата Сообщение от marat1905 Посмотреть сообщение
сразу виснет View
Вы чё-то перемудрили с функцией фильтрацией.
Там ничего кроме определения прохождения элемента через фильтр быть не должно.
А, как я понял, вы там даже меняете значения свойств UI элементов.
Это всё выполняется в одном UI потоке и вполне возможна взаимоблокировка методов.

Сделайте простой фильтр:
C#
1
2
3
4
5
6
        private void CollectionViewSource_FilterLogs(object sender, FilterEventArgs e)
        {
            e.Accepted = true;
            if (e.Item is LogsViewModel logs)
               e.Accepted = logs.Mesto == Text_filterLogs;
        }
Посмотрите как он работает.
Если всё ОК, то понемногу добавляйте логику и определите после чего он станет тормозить.
1
1 / 1 / 1
Регистрация: 19.12.2016
Сообщений: 153
13.10.2021, 17:28
Элд Хасп, А как правильно фильтровать большой список чтоб View не зависала?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
13.10.2021, 19:24
Цитата Сообщение от marat1905 Посмотреть сообщение
А как правильно фильтровать большой список чтоб View не зависала?
Большой список не должен полностью весь материализовываться.
Для этого используется или ленивая подгрузка с фильтрацией на уровне Модели.
Или, что более типично для WPF, технологии виртуализации.
В этом случае через фильтр проходят только те элементы которые отображаются в данный момент.

Но вы же писали что проблема не размере списка?
0
1 / 1 / 1
Регистрация: 19.12.2016
Сообщений: 153
19.10.2021, 06:52
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но вы же писали что проблема не размере списка?
Нет проблемы еще не было с большими списками. Хотел узнать как в дальнейшем правильно фильтровать списки.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
19.10.2021, 11:35
Цитата Сообщение от marat1905 Посмотреть сообщение
Хотел узнать как в дальнейшем правильно фильтровать списки.
Решения используются разные.
Два основных описал выше: подгрузка коллекции по мере промотки в GUI и использование виртуализации.
И то, и другое в двух словах не объяснишь.

Добавлено через 54 секунды
marat1905, по вопросу в теме получилось всё сделать?
0
1 / 1 / 1
Регистрация: 19.12.2016
Сообщений: 153
19.10.2021, 12:03
Элд Хасп, Да получилось нашел ошибку у себя.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.10.2021, 12:03

Фильтрация ListView или DataGrid по нескольким критериям?
Допустим есть контрол таблицы неважно какой, нужно как по фото реализовать фильтр или группировку. Как это можно сделать?

Combobox в DataGrid
Нужно, чтобы только одна ячейка из всего столбца содержала в себе ComboBox. Кто что может подсказать?

Combobox + datagrid + бд
Знаю тема избита, но у меня что-то не выходит есть датагрид &lt;DataGrid x:Name=&quot;MainGrid&quot; Margin=&quot;10&quot;...

WPF. DataGrid в ComboBox
Доброго времени суток. В combobox'e должен лежать datagrid, это у меня есть (см. скрин), но combobox считает datagrid за один элемент и...

Заполнение ComboBox в DataGrid
Приветствую, ребята, помогите разобраться с такой проблемкой. Есть DataGrid, в нем есть колонки. В одну из колонок хочу добавить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Теория всего 6. Судьба неотвратима?
anaschu 21.07.2026
Математическое доказательство Судьбы: Точка бифуркации в едином тензорном ядре Модели ВсегоСвежее обновление питоновского ядра «Soil Chemistry 2. 0» дало нам неопровержимое математическое. . .
Теория всего 5. ядро Теории Всего: Математический изоморфизм репликаторов и иллюзия свободы воли
anaschu 21.07.2026
Единое ядро Теории Всего: Математический изоморфизм репликаторов и иллюзия свободы воли Главная задача «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы» (аттракторов. . .
сукцессия 37. Внедрил дипсик в свой оркестр из ИИ. У него закончилось пространство чата, потому опубликую выводы из его работы здесь
anaschu 21.07.2026
==================================================================== КОНТЕКСТ: Моделирование микоризной сукцессии (AM → ECM) ==================================================================== . . .
сукцессия 36. Делаю прогоны модели около порога бифуркации (превращения эндо микоризы в экто микоризу)
anaschu 21.07.2026
СУКЦЕССИЯ МИКОРИЗ: КАК МАТЕМАТИКА ОБЪЯСНЯЕТ ПОДЗЕМНУЮ ВОЙНУ Мы привыкли думать, что лес — это деревья. А грибы — это то, что мы собираем в корзинку осенью. Но если заглянуть под землю, окажется,. . .
ИИ и человечность
kumehtar 21.07.2026
Забавно, что общаясь с ИИ, я замечаю, насколько он высказывается умно, и насколько верит в людей. Он умеет прощать. Он знает как отвечать не обесценивая опыт других людей, даже если сам не верит. Он. . .
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru