0

Делаю фильтр по поиску

       var a1 = shetaviewModel.shetas.Where(x => GetPropertyValue(x, sd) != null);
       this.list1.ItemsSource = a1;

и все нормально работает до тех пор пока не произошла корректировка какой-либо строки . После корректировки мне надо сделать

    this.list1.Columns[sortcolumn].Sort(System.ComponentModel.ListSortDirection.Ascending));

и фильтр пропал , возвращается нефильтрованная таблица . Как бы это обойти .

Cost
  • 922
Bob
  • 15
  • Одно слово - Привязка (и я вам про него вроде как говорил). Ну не пишут в WPF и далее код вот так топорно, в стиле WinForms, да даже в WinForms уже давно не пишут так. UI в одном месте, данные в другом, все, точка, никак иначе, никаких list1.ItemsSource = a1. Самый простой пример привязки: В конструкторе окна DataContext = this;, в этом-же классе окна делаете публичное свойство нужного типа, например текст public string SomeText {get;} = "Некий текст";, далее в XAML пишете <TextBlock Text = "{Binding SomeText}" />, все, на экране у вас Некий текст. Сложно? Не думаю... – EvgeniyZ Jan 27 '24 at 14:30
  • Далее развиваете эту тему, отделяете UI от данных, вынося свойство в отдельный класс, тогда уже не = this, а = new НекийКласс();. Ну и в итоге приходите к такому, где у вас есть данные, которые обернуты в ICollectionView, который уже и привязывается к вашему list1. Ну а самому ICollectionView задаете уже хоть фильтр, хоть сортировку. То, что вы сейчас делаете - это вы сами себе палки в колеса пихаете, ибо вместо того, чтоб позволить проекту помогать вам, вы берете всю ответственность на себя, зачем - не понятно.. – EvgeniyZ Jan 27 '24 at 14:32
  • @EvgeniyZ , я полностью с вами согласен и кстати у меня так и сделано только я не конечный продукт пишу и нет никакого смысла писать совсем правильно то что я выкину поняв как оно работает . Тут в коллекциях вроде нет никаких view вот и получается что надо заменять ItemsSource на фильтрованную выборку а она слетает. Тогда надо иметь сразу два комплекта выборок исходный не изменяемый и фильтрованный подключаемый или можно сделать по другому ? у меня есть большие обьемы и хранить две копии как-то не хочется а подход хочу универсальный . – Bob Jan 28 '24 at 12:33
  • у меня так и сделано - я этого не вижу. Я вижу что вы имеете проблему скорей всего из-за того, что вы именно так не делаете, ибо имея привязки, о всяких ItemsSource забывается вовсе. нет никакого смысла - использовать молоток для варки супа, или всеж половник? Зачем использовать то, что положено, если через пару часов будет съедено, вот ваша логика. Я вам не говорю писать прям идеально, я вам говорю, чтоб вы писали как положено, криво, косо, без разницы, но с привязками. или можно сделать по другому - я вам уже сказал как делать, там не две коллекции, а обертка одной над другой. – EvgeniyZ Jan 28 '24 at 12:43
  • у меня есть большие обьемы - тогда такое надо делать на уровне базы, получать уже из нее отфильтрованный кусок данных, а не грузить все на клиента и сортировать там. Ваш вопрос сейчас про клиентскую фильтрацию, ну а за нее отвечает ICollectionView, где вы на лету можете ставить любой фильтр и любую сортировку, чего автоматически подтянет UI и отобразит это как надо. – EvgeniyZ Jan 28 '24 at 12:45
  • А можно тупой вопрос ? где находится ICollectionView я не видел такой . На счет базы нет , лучше загрузить сразу 100 000 строк чем загружать часто по 1000 строк для поиска ИВАНОВА и потом там должны видеть всю базу для поиска "глазами" . – Bob Jan 28 '24 at 13:04
  • где находится - Это уже спрашивайте у создателей авалонии, ибо это стандартный компонент WPF, на котором они и основывали свой проект, видать вынесли в отдельную библиотеку, ищите, должен быть либо он, либо аналог. для поиска ИВАНОВА - что мешает взять из базы всех таких пользователей и отобразить только их? На клиенте должны быть только важные данные, не более. Если вы грузите туда 100к строк ради лишь поиска на клиенте, чтож, это печально... – EvgeniyZ Jan 28 '24 at 13:12
  • Ну зато сервер и сеть мне благодарны а сервер так прямо жизнью мне обязан . А в авалонии нет такой коллекции , была бы и вопроса бы небыло . Есть еще один . Как мне вытащить имя прибинденного обьекта из DataGridTextColumn , не могу найти . – Bob Jan 28 '24 at 13:22
  • Сервер на то и сервер, чтоб обрабатывать огромные объемы данных моментально, а вот пару десятков мб, а то даже и гб на клиенте с его условно 4гб RAM и медленным процессором, вот кто вам точно не скажет спасибо за такой "подгон"... Откройте к примеру любой сайт с динамической прокруткой, нажмите F12 в браузере и начните листать страницу, увидите, что постоянно на сервер идет отправка запроса для получения следующих данных, в итоге клиент имеет только то, что ему нужно на данный момент, а не 100к лишних данных лишь чтоб найти "Иванова"... – EvgeniyZ Jan 28 '24 at 13:33
  • ICollectionView в авалонии походу обернули в DataGridCollectionView, действует судя по документации, аналогично, можете взять ее. Как мне вытащить имя прибинденного обьекта - не работайте с UI, работайте с данными. У вас есть привязанная коллекция - вот из нее и берите все, что хотите. Нужно то, что выделено, создайте отдельно публичное свойство и привяжите его к условному SelectedItem, будете всегда иметь в данном свойстве то, что сейчас выделено. – EvgeniyZ Jan 28 '24 at 13:35
  • Да про DataGridCollectionView я уже увидел , спасибо за наводку сейчас буду копать в эту сторону . А из SelectedItem как вытащить одно поле ? я могу вытащить всю структура со всеми полями а какое из них прибиндено к нужной колонке по моему только из биндинга можно вытащить . У меня поиск делается по сортированному столбику . – Bob Jan 28 '24 at 13:55
  • Одна строка = 1 объект конкретного класса, это стандарт заполнения всяких DataGrid. Столбец = конкретное свойство данного класса. Условно class User { public int Id {get;set;} public string Name {get; set;} } ... public List<User> Users {get;} = new {new User { Id = 1, Name = "Вася" }}; public User SelectedUser {get;set;} ... <DataGrid ItemsSource = "{Binding Users}" SelectedItem = "{Binding SelectedUser}" />, данный код выведет на экран одного пользователя, у которого будет 2 колонки, ну а при выделении, в SelectedUser будет сам класс, из которого и получайте данные. – EvgeniyZ Jan 28 '24 at 14:00
  • Условный поиск в таком случае будет к примеру такой: var result = Users.Where(x=>x.Name == "Вася");, ну а в случае с фильтрацией (если ее настроили), там будет что-то по типу Filter = user => user.Name == "Вася"; Ну, то есть простая работа с классами, а не с UI. – EvgeniyZ Jan 28 '24 at 14:02
  • Извиняюсь если надоел , мне надо узнать к примеру что ко второй колонке прибинден ID При событии сортировки я могу запомнить номер сортируемой колонки sortcolumn = e.Column.DisplayIndex; а вытащить слово ID как ? – Bob Jan 28 '24 at 14:11
  • Вы меня не хотите походу понимать. Еще раз повторю, вы должны работать с данными, а не с UI. "Слово ID" - это UI часть, а не данные. Данные в свою очередь - это все, что относится к условному "человеку" (если разбираем мой пример). Аналогично и "Колонка", "Столбец", "Строка", и так далее - это все UI, которые вам попросту не нужны, ибо вы должны работать с привязанными данными. – EvgeniyZ Jan 28 '24 at 14:15
  • Да вроде хочу понять но не получается . Вот вы пишете Filter = user => user.Name == "Вася"; так не пойдет потому что данные отсортированы вовсе не по столбику Name а по столбику где ID и мой поиск делается так opens.Shet = shetaviewModel.shetas.First(x => GetPropertyValue(x, sd) != null); } где в SD хранится имя или name или id и дальше GetPropertyValue который и отвечает за фильтрацию а SD я заполняю так string? sd = this.list1.Columns[sortcolumn].Tag?.ToString(); откуда видно что я это имя пришу в колонке еще и в tag потому что из биндинга вытащить не умею . Ладно спасибо за помощь . – Bob Jan 28 '24 at 14:31
  • Вы пробовали реализовать то, о чем я говорю? Еще раз повторю, вы меня не слышите. Я вам о привязках и работе с данными, где прям жирным выделяю "Вы не должны работать с UI", но вы уперто пытаетесь получить UI данные, упорно работаете с UI (list1.Columns), вместо того, чтоб просто пойти и сделать. Я ведь вам даже ссылку кидал с подробнейшим примером, но нет, мы уже с вами битый час говорим об одном.... – EvgeniyZ Jan 28 '24 at 14:35
  • Хорошо , наверно я не догоняю , ну вопрос . Допустим у вас есть модель из трех полей но в view вы не знаете как они располагаются , вы можете написать поиск по любому из трех столбиков в зависимости от того какой столбик пользователь отсортирует ? можно на пальцах обьяснить направление ? – Bob Jan 28 '24 at 15:01

0 Answers0