将绑定源更改回查看XAML中容器的模型

问题描述:

我正在使用Silverlight 4MVVM模式。将绑定源更改回查看XAML中容器的模型

我的视图模型有两个属性:

  • SomeProperty
  • MyCommand

SomeProperty是一个复杂的类型,有很多子属性。 MyCommand是一个属性来处理从一个按钮指挥。

我有一个子窗口(视图)与网格作为LayoutRoot绑定到视图模型的SomeProperty属性。

<Grid x:Name="LayoutRoot" DataContext="{Binding SomeProperty, Mode=TwoWay}"> 
    ... 
</Grid> 

然而,网格内我想一个按钮的Command属性绑定到视图模型的MyCommand属性:

<Button Command={Binding MyCommand} /> 

但是,这是行不通的,因为MyCommand是视图模型的属性,而不是视图模型的属性SomeProperty属性。 (当我点击按钮它不执行命令。)

Anywho,有没有办法在Silverlight 4中使用数据绑定,这样我可以有一个容器UI元素明确地设置它的DataContext属性,但然后有一个容器中的不同控件引用一个属性,该属性是包含控件的DataContext的同级(或父级或其他)?

我目前的解决方法是在视图的类中定义绑定,但我宁愿将它放在XAML中。

谢谢

如果你给你的根元素(ChildWindow,UserControl,whatever)一个名字,那么你可以使用ElementName来获取视图模型。

<UserControl x:Name="MyUserControl"> 
    <Grid x:Name="LayoutRoot" DataContext="{Binding SomeProperty, Mode=TwoWay}"> 
     <Button Command="{Binding MyCommand}" DataContext="{Binding DataContext, ElementName=MyUserControl}" /> 
    </Grid> 
</UserControl> 

或者,这里是另一种做同样事情的方法。

<UserControl x:Name="MyUserControl"> 
    <Grid x:Name="LayoutRoot" DataContext="{Binding SomeProperty, Mode=TwoWay}"> 
     <Button Command="{Binding DataContext.MyCommand, ElementName=MyUserControl}" /> 
    </Grid> 
</UserControl> 
+0

这正是我要做的,简单,容易理解,只是一个小小的XAML。 – 2012-04-13 11:29:13

您尝试添加datacontext绑定? datacontext必须指向你的视图模型,因为默认的数据上下文是父控件或父数据上下文,在这种情况下,你的布局根。

this

this

我希望这帮助。 此致敬礼。

+0

是的,在我看来的构造我给你我的视图模型到视图的'DataContext'财产。问题在于LayoutRoot将ITS DataContext指定为视图模型DataContext的子属性,并且在LayoutRoot中的Button中我想引用DataContext中的属性。我希望这是有道理的。 – 2012-04-12 20:48:20

我使用BindableProxy的版本,在这个职位描述: http://weblogs.asp.net/dwahlin/archive/2009/08/20/creating-a-silverlight-datacontext-proxy-to-simplify-data-binding-in-nested-controls.aspx

你上面的网格(可能是用户控件中。参考资料),您将创建:

<UserControl.Resources> 
    <ns:BindableProxy x:Key="BindableProxy" /> 
<UserControl.Resources> 

然后,在按键绑定:

<Button Command="{Binding DataSource.MyCommand, Source={StaticResource BindableProxy}}" />