Как установить значение в ViewModel из привязки? - PullRequest
1 голос
/ 02 марта 2010

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

На каждой панели содержимого я устанавливаю свою модель просмотра:

<ContentPane>
  <viewmodels:MyViewModelForTab1 />
</ContentPane>

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

Итак, вопрос в том, как мне установить эту информацию в моей ViewModel? Делать мою ВМ объектом зависимости кажется плохой идеей, так как я уже реализовал INotifyPropertyChanged. Использование CLR в моей виртуальной машине также не работает, так как вы не можете привязаться к нему.

Как я могу узнать, является ли моя виртуальная машина текстовым контентом активной вкладки?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 марта 2010

Я не знаю модель Infragistics, поэтому я приношу свои извинения, если это неуместно, но вот как я реализую это с помощью обычных элементов управления - контроль вкладок, список, все что угодно.

Создайте класс модели представления контейнера, который включает в себя наблюдаемую коллекцию элементов и предоставляет свойство SelectedItem. Сделайте класс контейнера контекстом данных элементов управления. Свяжите свойство SelectedItem элемента управления с классом контейнера.

Подключите объект предмета к событию PropertyChanged контейнера . Поэтому теперь, когда выбранный элемент в пользовательском интерфейсе изменяется, модель представления контейнера уведомляет все элементы, которые SelectedItem изменились. Обработчик события каждого объекта элемента может сам определить, является ли он выбранным элементом сейчас.

Таким образом, объекты item не знают никаких деталей реализации UI - вы можете тестировать свои классы вне UI, и логика все равно будет работать правильно.

0 голосов
/ 02 марта 2010

Я бы поместил свойство IsSelected в свою ViewModel и связал его со свойством зависимостей TabItem IsSelected.

Это должно позволить вам подключаться при обновлении и выполнять все, что вам нужно. Здесь вам не нужен шаблон-посредник, поскольку вы связываетесь от View к ViewModel.

Убедитесь, что ваша ViewModel связана со свойством DataContext представления (в частности, что DataContext вкладки является ViewModel). То, как вы сейчас это делаете, ваша ViewModel - это содержимое элемента, не привязанное к DataContext, как должно быть:

<Tab.Resources>
    <viewmodels:MyViewModelForTab1 x:Key="Tab1ViewModel" />
</Tab.Resources>

<ContentPane DataContext="{StaticResource Tab1ViewModel}" />

Или что-то в этом роде ...

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