将绑定源更改回查看XAML中容器的模型
我正在使用Silverlight 4和MVVM模式。将绑定源更改回查看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>
我使用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}}" />
这正是我要做的,简单,容易理解,只是一个小小的XAML。 – 2012-04-13 11:29:13