Привязка 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}"
Другие вопросы по тегам