События WPF, команды или их использование

Я создаю инфраструктуру своего приложения, и мне трудно добиться очень простого поведения - я хочу вызывать события из разных пользовательских элементов управления в системе и иметь возможность перехватывать эти события в некоторых других пользовательских элементах управления, которые слушают их. Например, у меня есть пользовательский элемент управления, реализующий TreeView. У меня есть еще один пользовательский элемент управления, который реализует ListView. Теперь я хочу, чтобы мой ListView прослушивал TreeView, и когда выбор изменяется в TreeView, я хочу соответствующим образом повторно заполнить свой ListView. Я также хочу, чтобы это произошло, даже если ListView не находится в TreeView в логическом дереве WPF.

ПОЖАЛУЙСТА ПОМОГИ!!

Спасибо, Оран


person OrPaz    schedule 11.07.2010    source источник


Ответы (2)


Используйте привязку данных.

Если содержимое представления списка хранится внутри объекта, показанного в представлении дерева, вы можете просто привязать его к свойству SelectedItem дерева.

В противном случае привяжите дерево SelectedItem к свойству в ваших моделях представления (или вашем окне!) и в установщике этого свойства измените список, который привязан к свойству ItemSource представления списка.

Вы можете увидеть технику в эта серия в моем блоге сообщение, на которое я ссылаюсь, является последним сообщением со ссылкой для скачивания кода, вам нужно будет прочитать с начала серии, если вы хотите полное объяснение.

РЕДАКТИРОВАТЬ: Вот как я сделал это в одном проекте: (определение GridView удалено, так как оно здесь не актуально)

    <TreeView 
        Name="FolderTree" 
        Width="300" 
        ItemsSource="{Binding Root.SubFolders}"
        ItemTemplate="{StaticResource FolderTemplate}"/>
    <ListView 
        Name="FileView"
        ItemsSource="{Binding ElementName=FolderTree, Path=SelectedItem.Files}">
    </ListView>

Список, привязанный к ItemsSource древовидного представления, состоит из объектов, которые имеют 3 свойства: имя (которое привязано к TextBlock в FolderTemplate), вложенные папки (которое также привязано к свойству HierarchicalDataTemplate.ItemsSource) и файлы, которые привязаны к ListView используя {Binding ElementName=FolderTree, Path=SelectedItem.Files}

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

person Nir    schedule 11.07.2010
comment
Спасибо. На самом деле я использую привязку данных из списка к другим элементам приложения. Но я не могу сделать то же самое для древовидной структуры, так как она не поддерживает шаблон ObservableCollection. Проще говоря: я просто хочу иметь возможность просто отправлять сообщения (с данными) из разных частей приложений в разные части, даже если отправитель не вложен в геттер. например: ‹Окно› ‹TreeView Отправить сообщение всему миру.../› ‹ListView Получить сообщение, которое относится ко мне.../› ‹/Window› ВСЕ ЕЩЕ ЗАПРОШУ ПОМОЩИ :) БУДЕТ ПРИГЛАШЕН НЕКОТОРЫЙ ДЕМО-КОД...: ) Спасибо... - person OrPaz; 11.07.2010
comment
@OrPaz - я добавил образец, это то, как я это сделал, и самый чистый способ, которым я могу это сделать в WPF, вы не можете заставить элемент управления транслировать сообщение миру, и даже если бы вы могли, вы не можете заставить другой элемент управления волшебным образом понять это. Если вы хотите использовать команды или события, все, что вам нужно сделать, это написать старый добрый код программной части, который будет получать события из TreeView и обновлять ListView. - person Nir; 12.07.2010
comment
Спасибо Нир. Это отличный материал. Я думаю, что теперь я получил картину лучше. Последний вопрос (на данный момент :) ): мне также предложили использовать некоторые сторонние материалы для реализации шаблонов проектирования ModelView (MVVM light или Prism) и упростить работу. Хотя я знаком с смешиванием библиотек (исходя из java), я склонен использовать основные материалы WPF и создавать свой собственный механизм. Но если эти библиотеки есть у большинства, я буду изучать и использовать их. Как вы думаете: вы бы настоятельно рекомендовали использовать их или лучше использовать «простой» WPF? Огромное спасибо... - person OrPaz; 12.07.2010
comment
@OrPaz - я никогда не использовал MVVM light или Prism, поэтому не могу их комментировать. шаблон MVVM имеет большое значение для WPF, но у него есть некоторые недостатки, и каждый фреймворк MVVM решает их по-своему, поэтому вам нужно выбрать тот, который подходит вашему проекту и стилю программирования, или вы можете использовать простой WPF без фреймворка MVVM, WPF отлично работает без MVVM (единственное, что дает вам большинство сред MVVM, — это возможность писать модульные тесты). Я рекомендую просмотреть это перед выбором фреймворка: live.visitmix.com/MIX10/Sessions/EX15 (просто увидеть потенциал, а не писать свой) - person Nir; 12.07.2010
comment
(продолжение) Я сказал, что не могу комментировать Prism и MVVM light, но должен сказать, по моему личному мнению, ничего не говоря о конкретной библиотеке, что системы публикации/подписки в библиотеках MVVM представляют собой глобальные сложные решения локальных простых проблем. и замена однострочного решения с выделенным кодом чудовищной системой обмена сообщениями только для того, чтобы сохранить архитектуру и обеспечить возможность тестирования (в кавычках, потому что эти тесты должны быть такими же сложными, как и приложение) непродуктивно. Я бы не стал выбирать фреймворк, которому нужны глобальные настройки для правильного закрытия формы. - person Nir; 12.07.2010

Это тот момент, когда дополнительная сложность MVVM (шаблон Model-View-ViewModel) может начать окупаться. Что вам нужно, так это инфраструктура публикации/подписки, и MVVM Light имеет ее вместе с хорошей структурой MVVM, которая не не усложняйте. Prism — еще одна хорошая основа инфраструктуры WPF/Silverlight с поддержкой публикации и подписки.

person Cylon Cat    schedule 11.07.2010
comment
Спасибо. Мне трудно попасть в WPF (из Java). Я не могу сейчас думать об изучении сторонних материалов... Надеюсь изучить их в будущем... Большое спасибо, - person OrPaz; 11.07.2010
comment
Оба они являются проектами с открытым исходным кодом, включая Prism, разработанную Microsoft. Так что ни один из них не является огромным, как сторонний продукт. MVVM Light на самом деле довольно мал. Дело в том, что то, что вы пытаетесь сделать, не является тривиальным, и даже опытные разработчики WPF будут использовать один из них или что-то подобное или разрабатывать свои собственные. Но то, что вы пытаетесь сделать, вероятно, будет лучше работать с командами и почти наверняка потребует публикации и подписки, поскольку один пользовательский элемент управления не может по-настоящему рассчитывать на то, что другие пользовательские элементы управления могут или не могут присутствовать в любой конкретный момент времени. - person Cylon Cat; 11.07.2010
comment
(продолжение) И Prism, и MVVM Light используют команды для поддержки публикации/подписки. Если вы хотите свернуть свой собственный, место для размещения поддержки публикации/подписки будет на уровне приложения (проще всего использовать code-behind.for app.xaml). Это всегда будет присутствовать, и любой пользовательский элемент управления может публиковать и подписываться на одну службу таким образом. - person Cylon Cat; 11.07.2010
comment
Спасибо вам! Вы действительно помогли мне, признав, что это не тривиально, поскольку я действительно чувствовал это, пытаясь реализовать это. Очень просто отправить компоненты из компонентов в обычное программирование Windows... В любом случае, я внимательно рассмотрю те проекты, которые вы упомянули выше. Другое дело: вы упомянули публикацию/подписку - вы вообще говорите о шаблоне или в WPF уже присутствует какая-то реализация? Спасибо - person OrPaz; 12.07.2010
comment
И шаблон, и реализация. И Prism, и MVVM Light имеют реализации публикации/подписки, особенно для WPF и Silverlight. Вот почему я рекомендовал их. Что касается обмена сообщениями... WPF просто отличается от Winforms. Вы можете использовать обработчики событий для обмена сообщениями, если вы можете установить ссылку на объект с обработчиком событий - иногда проще сказать, чем сделать. Привязка данных WPF основана на шаблонах наблюдателя и уведомления, реализованных частично в WPF и частично либо в платформе .NET (класс ObservableCollection), либо в коде приложения. - person Cylon Cat; 12.07.2010
comment
У MVVM Light есть начальная страница по адресу galasoft.ch/mvvm/getstarted, которая также может помочь. - person Cylon Cat; 12.07.2010