Делаю свой контрол, наследник от ItemsControl. На который будут биндить коллекции данных.
Предположим хочу реализовать свой малтиселекшен. Это значит что у меня будет
возвращать какой то контейнер мой, у которого делаю DependencyProperty IsSelected.
Одновременно у контрола-наследника от ItemsControl веду коллекцию Selection. Т.о. IsSelected и Selection жестко связаны.
И вот беда, я не могу понять как отработать удаления айтема, чтобы скорректировать Selection. Потому что если айтема нет то и в селекнутых его не должно.
Сделал костыль, в
сбрасываю IsSelected и этим корректирую Selection. Но вот беда, при вызове Move он тоже срабатывает. А от Move селекшен точно не должен сбрасыватся. Это критично.
Пробовал ItemContainerGenerator.ItemsChanged обрабатывать, там можно отличить удаление от перемещения. Но в аргументах кроме какой то странной Position ничего нет.
Какой то бедлам соглашений с нотификацией изменения коллекций. Ну есть же уже INotifyCollectionChanged, нет же они придумали еще какой то способ причем там инфа ни вся.
Умом понимаю что ItemsControl надо юзать, но с другой стороны что ни маленькая проблема то через какую то задницу решение.
за этим стоит своя философия: если нужно абсолютно отличную от уже существующего поведения реализацию, то только тогда делается свой контрол, в противном же случае берётся уже имеющaяся реализация с подходящим поведением, с помощью стилей всё доводится (лишь оптически) до ума, это обычно намного проще
Здравствуйте, takTak, Вы писали:
T>oпять мастера,которые хотят прогнуть этот мир !
T>нафига так сложно? почему не взять обычный ListBox, у которого всё уже сделано, добавить свой стиль, который изображает так как надо и всё?!
Ну когда напишите хоть один свой контрол (ни UserControl а именно контрол), тогда поговорим. А до сих пор я вижу вы кроме ListBox ничего не видели.
T>>oпять мастера,которые хотят прогнуть этот мир !
T>>нафига так сложно? почему не взять обычный ListBox, у которого всё уже сделано, добавить свой стиль, который изображает так как надо и всё?!
_>Ну когда напишите хоть один свой контрол (ни UserControl а именно контрол), тогда поговорим. А до сих пор я вижу вы кроме ListBox ничего не видели.
делал я уже такое давно: когда не было один раз breadcrumb_a и иерархического грида — в другом случае, просто это было лет 5 назад, я уже всё забыл
T>>
T>>ты , похоже, не только грамотно писать, но и читать не особенно умеешь...
_>Грамотный, ты ListBox освоил, молодец. Иди теперь почитай про ItemsControl.
не за что!
если ты когда-то поймёшь, что такое наследование и полиморфизм и сможешь назвать хоть одну функциональность ItemsControl, которую не может обеспечить его наследник ListBox, то ...
T>>>
T>>>ты , похоже, не только грамотно писать, но и читать не особенно умеешь...
_>>Грамотный, ты ListBox освоил, молодец. Иди теперь почитай про ItemsControl.
T>не за что! T>если ты когда-то поймёшь, что такое наследование и полиморфизм и сможешь назвать хоть одну функциональность ItemsControl, которую не может обеспечить его наследник ListBox, то ...
Малыш, все понимаю, тебе хочется помочь. Спасибо за это. Но читай сабж, ни надо листбокса.
Здравствуйте, barn_czn, Вы писали:
_>Умом понимаю что ItemsControl надо юзать, но с другой стороны что ни маленькая проблема то через какую то задницу решение.
Архитектура ItemsControl, не позволяет в общем случае удалить только один элемент. При изменении коллекции запускается процесс перегенерации всех элементов. Если посмотрите на реализации всяких коммерческих гридов и т.п. увидите, что там бОльшая часть этого стека переписана с нуля. В целом, такое поведение вполне себе ок, потому что для больших списков есть виртуализация и можно ресайклить контейнеры при желании. Короче, если вам нравится жрать этот кактус, то рефлектор в руки и смотрите как, что работает там в потрохах, может что и расковыряете (официальной документации на эту тему практически нет). Практически же, любая задача, связанная с выделением каких-либо элементов решается, через ListBox или ListView, в зависимости от сложности данных и их представления.
Здравствуйте, barn_czn, Вы писали:
_>Здравствуйте, takTak, Вы писали:
T>>oпять мастера,которые хотят прогнуть этот мир !
T>>нафига так сложно? почему не взять обычный ListBox, у которого всё уже сделано, добавить свой стиль, который изображает так как надо и всё?!
_>Ну когда напишите хоть один свой контрол (ни UserControl а именно контрол), тогда поговорим. А до сих пор я вижу вы кроме ListBox ничего не видели.
Я писал свои контролы для WPF и не только, могу поделиться парой принципов, которые мне помогали в работе:
1. Писать как можно меньше кода
2. Внимательно читать документацию и код фреймворка, чтобы соблюдать принцип №1
Если я вдруг обнаруживаю, что мне надо лезть в кишки WPF, чтобы сделать какую-то элементарную штуку, значит где-то я что-то упустил из вида. Тут абсолютно тот же случай. Кроме того, WPF настолько гибок, что своих контролов можно не писать почти всегда.
Здравствуйте, Visor2004, Вы писали:
V>Здравствуйте, barn_czn, Вы писали:
_>>Умом понимаю что ItemsControl надо юзать, но с другой стороны что ни маленькая проблема то через какую то задницу решение.
V>Архитектура ItemsControl, не позволяет в общем случае удалить только один элемент. При изменении коллекции запускается процесс перегенерации всех элементов. Если посмотрите на реализации всяких коммерческих гридов и т.п. увидите, что там бОльшая часть этого стека переписана с нуля. В целом, такое поведение вполне себе ок, потому что для больших списков есть виртуализация и можно ресайклить контейнеры при желании. Короче, если вам нравится жрать этот кактус, то рефлектор в руки и смотрите как, что работает там в потрохах, может что и расковыряете (официальной документации на эту тему практически нет). Практически же, любая задача, связанная с выделением каких-либо элементов решается, через ListBox или ListView, в зависимости от сложности данных и их представления.
Коммерческие гриды грешат изобретением велосипедов, я бы не стал ими руководствоваться в качестве примера для подражания. Вообще работа с коллекциями элементов очень гибкая за счет класса CollectionView — классы-наследники ItemsControl заточены на работу именно с ним, а не просто интерфейсом ICollectionView. Если использовать ListCollectionView в своём коде, то контролы будут оперативно реагировать на операции с ним через биндинг к ItemSource.
_>>Ну когда напишите хоть один свой контрол (ни UserControl а именно контрол), тогда поговорим. А до сих пор я вижу вы кроме ListBox ничего не видели.
V>Я писал свои контролы для WPF и не только, могу поделиться парой принципов, которые мне помогали в работе:
V>1. Писать как можно меньше кода
Вы просто гений.
V>2. Внимательно читать документацию и код фреймворка, чтобы соблюдать принцип №1
V>Если я вдруг обнаруживаю, что мне надо лезть в кишки WPF, чтобы сделать какую-то элементарную штуку, значит где-то я что-то упустил из вида. Тут абсолютно тот же случай. Кроме того, WPF настолько гибок, что своих контролов можно не писать почти всегда.
Попробуйте написать дерево с малтиселекшеном и вы быстро поймете где кончается гибкость.