Привязка Silverlight
У меня есть страница Silverlight, использующая MVVM для обработки всех происходящих битов данных.
Контекст данных устанавливается для страницы с помощью:
DataContext="{Binding AddNewClientViewModel, Source={StaticResource ServiceLocator}}"
ServiceLocator - это сервис, который позволяет мне создавать и внедрять соответствующую виртуальную машину с использованием контейнера IoC.
Это все отлично работает.
Теперь у меня есть DataForm так:
<df:DataForm CurrentItem="{Binding NewClient}" AutoGenerateFields="False" >
<df:DataForm.NewItemTemplate>
<DataTemplate>
<StackPanel>
<df:DataField>
<TextBox Text="{Binding ClientName}" />
</df:DataField>
<df:DataField>
<TextBox Text="{Binding Property_on_the_VM_not_on_NewClient}" />
</df:DataField>
</StackPanel>
</DataTemplate>
</df:DataForm.NewItemTemplate>
</df:DataForm>
Итак, эта форма данных связывается со свойством NewClient в моей ViewModel. Первый DataField связывается с NewClient.ClientName. Второй DataField я бы хотел привязать к свойству, которое зависает от корневой ViewModel.
Я знаю, что есть параметр "Source", который вы можете передать при связывании, если бы у меня был статический ресурс виртуальной машины или тому подобное, я мог бы указать на это, но я не знаю. Как я могу связать эту привязку со свойством на родительской виртуальной машине?
редактировать
После публикации Джоби ниже, я попробовал следующее:
<TextBox DataContext="{Binding DataContext, ElementName=root}" Text="{Binding MyProperty}" />
И мой контроль на высшем уровне:
x:Name="root"
DataContext="{Binding AddNewClientViewModel, Source={StaticResource ServiceLocator}}"
Никаких костей с тем, чтобы заставить это работать...
2 ответа
Что вам нужно, так это DataContextProxy, который был создан Дэном Уолином. Проблема в том, что как только вы попадаете в форму данных, у вас появляется новый контекст данных. Нет простого способа вернуться обратно к контексту данных представления. Прокси-контекст контекста данных позволяет вам легко это сделать, и я использовал его, но обнаружил, что он отлично работает.
Во втором TextBox вы можете сделать привязку ElementName к корневому элементу, к которому у родительской виртуальной машины уже есть DataContext.
<TextBox DataContent="{Binding DataContext, ElementName=rootLevelControl}" Text="{Binding property}"