WPF - CAL - Несколько родителей для одного экземпляра контроля? - PullRequest
1 голос
/ 04 октября 2009

Я работаю над решением PRISM / CAL, но проблема может быть связана с WPF:

Если я создаю один экземпляр элемента управления (например, TextBlock) и добавляю его как дочерний элемент в StackPanel, невозможно добавить его как «дочерний элемент» в другой StackPanel (родительский элемент уже установил ошибку). Я вроде понимаю причину (это также происходит при использовании RegionManager).

Но каков рекомендуемый способ, если визуальный элемент управления очень сложен и должен создаваться только один раз и использоваться в двух местах ? Я согласен, что на самом деле нет смысла показывать идентичный элемент управления 2 раза на экране, но могут быть случаи, когда он полезен (например, кнопка «Закрыть все»).

Я знаю, что в случае кнопок мне нужно просто создать две кнопки, привязанные к одной базе данных ICommand. Но применимо ли это правило и к гораздо более сложным элементам управления (всегда создавайте новые экземпляры) ...

Я наткнулся на эту проблему при создании переключателя макета, который создает список кнопок и панель стека для каждого графического интерфейса отдельно, но использует статический ObservableCollection кнопок в качестве источника (который вызывает странные ошибки) ..

Есть идеи на эту тему?

Chris

Ответы [ 2 ]

1 голос
/ 05 октября 2009

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

Короче, не добавляйте TextBlock к вашему StackPanel. Вместо этого добавьте экземпляр вашего типа данных (например, Customer) и свяжите DataTemplate с типом Customer. Невозможно создать одного и того же UIElement в нескольких местах.

0 голосов
/ 05 октября 2009

Вы можете добавить свой элемент управления (или коллекцию элементов управления) в качестве ресурса и ссылаться на них посредством привязки в своих элементах управления. Это неявно создаст копию (они будут Freezable, а WPF их скопирует).

Как правило, вы должны использовать DataTemplates, как рекомендует Кент, но если у вас есть особый случай, это, вероятно, сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...