UserControl.Resources / Получить ссылку на ViewModel - PullRequest
0 голосов
/ 12 июня 2011

Я создаю свою виртуальную машину так:

DataContext="{Binding Source={StaticResource ViewModelLocatorService}, Path=FlowDateRatchetViewModel}"

Это нормально, но когда я привязываюсь к своим командам, я обычно делаю это:

Command="{Binding ElementName=ucFlowDateRatchets, Path=DataContext.AddFlowDateRatchetCommand}"

Что это такое?Я должен делать, когда я в шаблоне, поскольку DataContext находится внутри ViewModel, и это позволяет мне начинать сверху.

Есть ли способ сделать что-то вроде:

<UserControl.Resources>
    <VM:FlowDateRatchet x:key="FlowDateRatchetViewModel" Constructor?????={Binding....
</UserControl.Resources>

так, чтобы команда была такой:

Command="{Binding Source={StaticResource FlowDateRatchetViewModel}, Path=AddFlowDateRatchetCommand}"

Мне всегда кажется, что мне не удается убедиться, что я начинаю в правильном контексте, когда задаю привязку данных, и этот синтаксис обеспечит стабильность корневого каталога,ИМХО

Куда я иду не так?

1 Ответ

0 голосов
/ 07 июля 2011

Дэн Уолин У него была очень похожая проблема, он хотел упростить привязку к DataContext родительского элемента управления и придумал такую ​​красоту: DataContextProxy .Пока я пытался создать экземпляр класса и получить ссылку на него (точно так же, как вы получаете ссылку на класс через свойство DataContext), Дэн выбрал другой маршрут и позволяет DataContext создать и получить ссылку на экземпляр класса.Как он описывает в своей статье, он создал класс, который ссылается на свойство DataContext родительского объекта и предоставляет эту ссылку в ссылке User.Resources (отсюда и суффикс Proxy!).Затем привязки могут получить ссылку, просто используя атрибут привязки StaticReference.

Я выполнил то же самое, либо: 1) присвоив имя UserControl и используя атрибут ElementName (недостатком является то, что вы назвали UC, имногократное использование одного и того же UC приведет к дублированию имен на странице) или 2) в SL5 с использованием RelativeSource и через AncestorType, указывая его на UserControl.Оба они длинны и требуют, чтобы путь был Path = "DataContext."который я ненавидел.

Все еще экспериментирую, но я думаю, что это хорошо сработает, и обеспечит ясность в привязках.

Я сделал одно небольшое изменение и добавил немного RX-любви подписатьсяна событие по слабой ссылке:

Observable.FromEvent<RoutedEventArgs>(this,"Loaded")
          .Subscribe(pEvent => DataContextProxy_Loaded(pEvent.Sender, pEvent.EventArgs));

вместо

this.Loaded += new RoutedEventHandler(DataContextProxy_Loaded);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...