2009-11-08 82 views
1

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

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

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

服务定位是一个服务,它允许我创建并使用IoC容器注入适当的VM。

这一切工作正常。

现在我有数据形,像这样:

 <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> 

OK,所以这个数据形结合我的视图模型的NewClient财产。第一个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 which was created by Dan Wahlin。问题是,一旦你进入数据表单,你有一个新的数据上下文。没有简单的方法可以回到视图的数据上下文。数据上下文代理允许你轻松地做到这一点,我已经使用它很大一部分发现它很好。

+0

这看起来像个伎俩。将执行并报告回来。 – ChadT 2009-11-10 00:35:23

0

在第二个TextBox上,您可以对Parent VM已经有DataContext的根元素执行ElementName绑定。

<TextBox DataContent="{Binding DataContext, ElementName=rootLevelControl}" Text="{Binding property}" 
+0

嗨约比,这似乎应该工作,但我没有任何运气。我会用我尝试使用这个更新这个问题。 – ChadT 2009-11-08 22:10:13