Привязка одного элемента управления к свойству второго элемента управления, когда они размещены в разных представлениях - PullRequest
0 голосов
/ 30 мая 2011

Я ищу правильный способ связать элементы управления вместе.Допустим, у меня есть два отдельных взгляда.Каждое из этих представлений имеет контроль, и я хочу связать их вместе.Первый элемент управления имеет свойство зависимости и ожидает, что второй элемент управления будет назначен этому свойству.Если я правильно понимаю идею MVVM, я не хочу иметь эти элементы управления в моей модели представления, только данные.Поэтому я пытаюсь найти правильный способ передать управление из одного вида в другой.Свойство зависимости в коде View для привязки элемента управления?Это будет правильный способ сделать это?Хотя выглядит не очень чисто.Учитывая тот факт, что контекст данных представления будет моделью представления, а не кодом, я буду вынужден связать эти элементы управления вместе в коде вместо декларативного способа.Может быть, я упускаю что-то простое здесь.Любые предложения приветствуются.Чтобы уточнить:Ситуация следующая: 2 разных вида и 2 разных элемента управления.Каждый элемент управления находится в отдельном представлении.ControlA имеет свойство зависимости типа ControlB.Поэтому мне нужно сделать что-то похожее на привязку элементов, но проблема в том, что у меня нет обоих элементов в одном представлении.

Ответы [ 3 ]

0 голосов
/ 31 мая 2011

Вы имеете в виду, что у вас есть два представления, каждое с UserControlFoo, и вы хотите, чтобы эти два экземпляра UserControlFoo связывались с одними и теми же данными?Как, например, наличие ползунка в двух представлениях, привязанных к одним и тем же данным, и когда один ползунок перемещает другие перемещения, чтобы отразить изменение?

Если это так, просто свяжите оба представления с одним и тем же экземпляром ViewModel,убедитесь, что значение OnPropertyChanged увеличено при изменении значения, и установите для привязок 'UpdateSourceTrigger значение PropertyChanged.

. Вот пример, в котором есть два (или более) вида с ползунками, использующими ту же модель представления, что иDataContext:

В ViewModel:

private double _sliderValue;
public double SliderValue
{
    get { return _sliderValue; }

    set
    {
        if (_sliderValue != value)
        {
            _sliderValue = value;

            OnPropertyChanged("SliderValue");
        }
    }
}

В представлениях:

<Slider Value="{Binding Path=SliderValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

А затем просто иметь ту же модель представления, что и DataContext для обоих представлений

Это отвечает на ваш вопрос?

Если вы не знакомы с OnPropertyChanged, ознакомьтесь со статьей Джоша Смита: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

0 голосов
/ 02 июня 2011

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

Предположим, у вас есть 2 вида, с представлением A, содержащим элемент управления A, и представлением B, содержащим элемент управления B. У вас также есть модель представления для каждого вида. Модель представления - это то, где связь между представлениями будет происходить с использованием общего посредника. Кроме того, вы можете добавить посредник к каждому элементу управления как свойство зависимости и связать это свойство с посредником модели представления.

Вид A

  • Содержит элемент управления A
  • имеет свой DataContext установлен в ViewModel A
  • Взаимодействие пользователя с Control A позволяет получить / установить свойства модели представления с помощью привязки данных
  • Модель просмотра содержит общую ссылку на посредника / мессенджера

Вид B

  • Содержит элемент управления B
  • имеет свой DataContext установлен в ViewModel B
  • Взаимодействие пользователя с Control B позволяет получить / установить свойства модели представления с помощью привязки данных
  • Представление модели содержит общую ссылку на посредника / мессенджера

Таким образом, когда пользователь взаимодействует с элементом управления A в представлении A, взаимодействие заставляет посредника опубликовать сообщение, содержащее информацию о событии. Модель представления представления B подписывается на уведомление, когда это сообщение публикуется, и обновляет свои свойства, что вызывает изменение в элементе управления B посредством привязки данных.

Посредник, используемый обеими моделями представления, является одним и тем же экземпляром, часто внедряемым в модели представления с использованием контейнера IoC. Реализация посредника довольно тривиальна, и есть также несколько наборов инструментов MVVM, таких как MVVM Light, которые предоставляют класс «Messenger», который обеспечивает такой тип связи.

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

Посредники и ресурсы MVVM:

  1. Простой посредник
  2. MVVM Light Toolkit
  3. Реализация шаблона MVVM
  4. Агрегация событий
0 голосов
/ 30 мая 2011

Я не совсем уверен, что вы подразумеваете под "связать вместе", но, возможно, вы ищете что-то подобное?

<local:UserControlB x:Name="UserControlB" />
<local:UserControlA local:UserControlA.SubControlB="{Binding ElementName=UserControlB}" />

Почему вы в любом случае передаете управление между представлениями?Обычно вы передаете данные или DataContext

...