1

我有一个 Silverlight 页面,它背后使用一个 MVVM 来处理所有正在进行的数据位。

使用以下方法为页面设置数据上下文:

DataContext="{Binding AddNewClientViewModel, Source={StaticResource ServiceLocator}}"

ServiceLocator 是一项服务,它允许我使用 IoC 容器创建和注入适当的 VM。

这一切都很好。

现在我有一个像这样的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>

好的,所以这个数据表单绑定到我的 ViewModel 上的 NewClient 属性。第一个 DataField 绑定到 NewClient.ClientName。我想绑定到根 ViewModel 挂起的属性的第二个 DataField。

我知道绑定时可以传入“源”参数,如果我有虚拟机的静态资源或类似资源,我可以指出它,但我没有。如何将此绑定与父 VM 上的属性链接?


编辑

在下面 Jobi 的帖子之后,我尝试了以下方法:

<TextBox DataContext="{Binding DataContext, ElementName=root}"  Text="{Binding MyProperty}" />

我的顶级控制:

x:Name="root"
DataContext="{Binding AddNewClientViewModel, Source={StaticResource ServiceLocator}}"

让这个工作没有骰子......

4

2 回答 2

2

您需要的是由 Dan Wahlin 创建的 DataContextProxy。问题是一旦你进入数据表单,你就有了一个新的数据上下文。没有简单的方法可以返回到视图的数据上下文。数据上下文代理使您可以轻松地做到这一点,我已经使用了很多次,发现它工作得很好。

于 2009-11-09T19:15:08.073 回答
0

在第二个 TextBox 上,您可以将 ElementName 绑定到父 VM 已经有 DataContext 的根元素。

<TextBox DataContent="{Binding DataContext, ElementName=rootLevelControl}" Text="{Binding property}"
于 2009-11-08T09:42:54.020 回答