WPF, ItemsControl, отработать удаление айтема.
От: barn_czn  
Дата: 19.09.18 20:46
Оценка:
Делаю свой контрол, наследник от ItemsControl. На который будут биндить коллекции данных.
Предположим хочу реализовать свой малтиселекшен. Это значит что у меня будет

protected override DependencyObject GetContainerForItemOverride


возвращать какой то контейнер мой, у которого делаю DependencyProperty IsSelected.

Одновременно у контрола-наследника от ItemsControl веду коллекцию Selection. Т.о. IsSelected и Selection жестко связаны.
И вот беда, я не могу понять как отработать удаления айтема, чтобы скорректировать Selection. Потому что если айтема нет то и в селекнутых его не должно.
Сделал костыль, в

protected override void OnVisualParentChanged(DependencyObject oldParent)


сбрасываю IsSelected и этим корректирую Selection. Но вот беда, при вызове Move он тоже срабатывает. А от Move селекшен точно не должен сбрасыватся. Это критично.

Пробовал ItemContainerGenerator.ItemsChanged обрабатывать, там можно отличить удаление от перемещения. Но в аргументах кроме какой то странной Position ничего нет.
Какой то бедлам соглашений с нотификацией изменения коллекций. Ну есть же уже INotifyCollectionChanged, нет же они придумали еще какой то способ причем там инфа ни вся.

Умом понимаю что ItemsControl надо юзать, но с другой стороны что ни маленькая проблема то через какую то задницу решение.
Re: WPF, ItemsControl, отработать удаление айтема.
От: takTak  
Дата: 19.09.18 20:57
Оценка:
oпять мастера,которые хотят прогнуть этот мир !

нафига так сложно? почему не взять обычный ListBox, у которого всё уже сделано, добавить свой стиль, который изображает так как надо и всё?!




вот тут чувак делает так, как доктор прописал, всё делается стилями

за этим стоит своя философия: если нужно абсолютно отличную от уже существующего поведения реализацию, то только тогда делается свой контрол, в противном же случае берётся уже имеющaяся реализация с подходящим поведением, с помощью стилей всё доводится (лишь оптически) до ума, это обычно намного проще
Отредактировано 19.09.2018 21:06 takTak . Предыдущая версия . Еще …
Отредактировано 19.09.2018 21:04 takTak . Предыдущая версия .
Re[2]: WPF, ItemsControl, отработать удаление айтема.
От: barn_czn  
Дата: 19.09.18 21:00
Оценка:
Здравствуйте, takTak, Вы писали:

T>oпять мастера,которые хотят прогнуть этот мир !


T>нафига так сложно? почему не взять обычный ListBox, у которого всё уже сделано, добавить свой стиль, который изображает так как надо и всё?!



Ну когда напишите хоть один свой контрол (ни UserControl а именно контрол), тогда поговорим. А до сих пор я вижу вы кроме ListBox ничего не видели.
Re[3]: WPF, ItemsControl, отработать удаление айтема.
От: takTak  
Дата: 19.09.18 21:08
Оценка:
T>>oпять мастера,которые хотят прогнуть этот мир !

T>>нафига так сложно? почему не взять обычный ListBox, у которого всё уже сделано, добавить свой стиль, который изображает так как надо и всё?!



_>Ну когда напишите хоть один свой контрол (ни UserControl а именно контрол), тогда поговорим. А до сих пор я вижу вы кроме ListBox ничего не видели.



делал я уже такое давно: когда не было один раз breadcrumb_a и иерархического грида — в другом случае, просто это было лет 5 назад, я уже всё забыл
Re[4]: WPF, ItemsControl, отработать удаление айтема.
От: barn_czn  
Дата: 19.09.18 21:11
Оценка:
Здравствуйте, takTak, Вы писали:


T>делал я уже такое давно: когда не было один раз breadcrumb_a и иерархического грида — в другом случае, просто это было лет 5 назад, я уже всё забыл


Ну а фигли тогда спамить, если понимаешь отличие ItemsControl от какого то листбокса. Не знаешь ответа — не пиши, проблема вроде досканально описана.
Re[5]: WPF, ItemsControl, отработать удаление айтема.
От: takTak  
Дата: 19.09.18 21:19
Оценка:

_> досканально





ты , похоже, не только грамотно писать, но и читать не особенно умеешь...
Re[6]: WPF, ItemsControl, отработать удаление айтема.
От: takTak  
Дата: 19.09.18 21:40
Оценка:
вот это ListBox



и это — тоже
Re[6]: WPF, ItemsControl, отработать удаление айтема.
От: barn_czn  
Дата: 20.09.18 07:10
Оценка:
Здравствуйте, takTak, Вы писали:


T>

_>> досканально



T>


T>ты , похоже, не только грамотно писать, но и читать не особенно умеешь...


Грамотный, ты ListBox освоил, молодец. Иди теперь почитай про ItemsControl.
Re[7]: WPF, ItemsControl, отработать удаление айтема.
От: takTak  
Дата: 20.09.18 11:14
Оценка:
T>>

_>>> досканально



T>>


T>>ты , похоже, не только грамотно писать, но и читать не особенно умеешь...


_>Грамотный, ты ListBox освоил, молодец. Иди теперь почитай про ItemsControl.


не за что!
если ты когда-то поймёшь, что такое наследование и полиморфизм и сможешь назвать хоть одну функциональность ItemsControl, которую не может обеспечить его наследник ListBox, то ...
Re[8]: WPF, ItemsControl, отработать удаление айтема.
От: barn_czn  
Дата: 21.09.18 06:40
Оценка:
Здравствуйте, takTak, Вы писали:

T>>>

_>>>> досканально



T>>>


T>>>ты , похоже, не только грамотно писать, но и читать не особенно умеешь...


_>>Грамотный, ты ListBox освоил, молодец. Иди теперь почитай про ItemsControl.


T>не за что!

T>если ты когда-то поймёшь, что такое наследование и полиморфизм и сможешь назвать хоть одну функциональность ItemsControl, которую не может обеспечить его наследник ListBox, то ...

Малыш, все понимаю, тебе хочется помочь. Спасибо за это. Но читай сабж, ни надо листбокса.
Re: WPF, ItemsControl, отработать удаление айтема.
От: Visor2004  
Дата: 21.09.18 14:23
Оценка:
Здравствуйте, barn_czn, Вы писали:

_>Умом понимаю что ItemsControl надо юзать, но с другой стороны что ни маленькая проблема то через какую то задницу решение.


Архитектура ItemsControl, не позволяет в общем случае удалить только один элемент. При изменении коллекции запускается процесс перегенерации всех элементов. Если посмотрите на реализации всяких коммерческих гридов и т.п. увидите, что там бОльшая часть этого стека переписана с нуля. В целом, такое поведение вполне себе ок, потому что для больших списков есть виртуализация и можно ресайклить контейнеры при желании. Короче, если вам нравится жрать этот кактус, то рефлектор в руки и смотрите как, что работает там в потрохах, может что и расковыряете (официальной документации на эту тему практически нет). Практически же, любая задача, связанная с выделением каких-либо элементов решается, через ListBox или ListView, в зависимости от сложности данных и их представления.
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[3]: WPF, ItemsControl, отработать удаление айтема.
От: Vladek Россия Github
Дата: 09.10.18 08:32
Оценка:
Здравствуйте, barn_czn, Вы писали:

_>Здравствуйте, takTak, Вы писали:


T>>oпять мастера,которые хотят прогнуть этот мир !


T>>нафига так сложно? почему не взять обычный ListBox, у которого всё уже сделано, добавить свой стиль, который изображает так как надо и всё?!



_>Ну когда напишите хоть один свой контрол (ни UserControl а именно контрол), тогда поговорим. А до сих пор я вижу вы кроме ListBox ничего не видели.


Я писал свои контролы для WPF и не только, могу поделиться парой принципов, которые мне помогали в работе:

1. Писать как можно меньше кода
2. Внимательно читать документацию и код фреймворка, чтобы соблюдать принцип №1

Если я вдруг обнаруживаю, что мне надо лезть в кишки WPF, чтобы сделать какую-то элементарную штуку, значит где-то я что-то упустил из вида. Тут абсолютно тот же случай. Кроме того, WPF настолько гибок, что своих контролов можно не писать почти всегда.

Например, вот есть класс https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.primitives.multiselector?view=netframework-4.7.2 — вся реакция на исчезновение элементов из источника данных уже реализована.
Re[2]: WPF, ItemsControl, отработать удаление айтема.
От: Vladek Россия Github
Дата: 09.10.18 08:35
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Здравствуйте, barn_czn, Вы писали:


_>>Умом понимаю что ItemsControl надо юзать, но с другой стороны что ни маленькая проблема то через какую то задницу решение.


V>Архитектура ItemsControl, не позволяет в общем случае удалить только один элемент. При изменении коллекции запускается процесс перегенерации всех элементов. Если посмотрите на реализации всяких коммерческих гридов и т.п. увидите, что там бОльшая часть этого стека переписана с нуля. В целом, такое поведение вполне себе ок, потому что для больших списков есть виртуализация и можно ресайклить контейнеры при желании. Короче, если вам нравится жрать этот кактус, то рефлектор в руки и смотрите как, что работает там в потрохах, может что и расковыряете (официальной документации на эту тему практически нет). Практически же, любая задача, связанная с выделением каких-либо элементов решается, через ListBox или ListView, в зависимости от сложности данных и их представления.




https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.virtualizingstackpanel?view=netframework-4.7.2

UPDATE: не заметил, что виртуализация упомянута.

Коммерческие гриды грешат изобретением велосипедов, я бы не стал ими руководствоваться в качестве примера для подражания. Вообще работа с коллекциями элементов очень гибкая за счет класса CollectionView — классы-наследники ItemsControl заточены на работу именно с ним, а не просто интерфейсом ICollectionView. Если использовать ListCollectionView в своём коде, то контролы будут оперативно реагировать на операции с ним через биндинг к ItemSource.
Отредактировано 09.10.2018 8:42 Vladek . Предыдущая версия .
Re[4]: WPF, ItemsControl, отработать удаление айтема.
От: barn_czn  
Дата: 26.10.18 19:12
Оценка:
_>>Ну когда напишите хоть один свой контрол (ни UserControl а именно контрол), тогда поговорим. А до сих пор я вижу вы кроме ListBox ничего не видели.

V>Я писал свои контролы для WPF и не только, могу поделиться парой принципов, которые мне помогали в работе:


V>1. Писать как можно меньше кода


Вы просто гений.

V>2. Внимательно читать документацию и код фреймворка, чтобы соблюдать принцип №1


V>Если я вдруг обнаруживаю, что мне надо лезть в кишки WPF, чтобы сделать какую-то элементарную штуку, значит где-то я что-то упустил из вида. Тут абсолютно тот же случай. Кроме того, WPF настолько гибок, что своих контролов можно не писать почти всегда.


Попробуйте написать дерево с малтиселекшеном и вы быстро поймете где кончается гибкость.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.