我正在使用 Silverlight 4 和 MVVM 模式。
我的视图模型有两个属性:
SomeProperty
和MyCommand
SomeProperty
是一个复杂类型,有很多子属性。 MyCommand
是处理来自Button的命令的属性。
我有一个子窗口(视图),其中Grid为LayoutRoot
,它绑定到视图模型的SomeProperty
属性。
<Grid x:Name="LayoutRoot" DataContext="{Binding SomeProperty, Mode=TwoWay}">
...
</Grid>
但是,在Grid中我想将Button的Command
属性绑定到视图模型的MyCommand
属性:
<Button Command={Binding MyCommand} />
但这不起作用,因为MyCommand
是视图模型的属性,而不是视图模型的SomeProperty
属性的属性。 (当我点击按钮时,它不会执行命令。)
Anywho,有没有办法在Silverlight 4中使用数据绑定,这样我就可以让容器UI元素显式设置其DataContext
属性,但是在容器中有一个不同的控件引用一个兄弟属性(或含有对照的DataContext
的父母或其他什么?
我目前的解决方法是在视图的类中定义绑定,但我宁愿在XAML中使用它。
由于
答案 0 :(得分:3)
如果你给你的根元素(ChildWindow,UserControl,等等)一个名字,那么你可以使用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>
答案 1 :(得分:0)
您尝试将datacontext添加到绑定? datacontext必须指向您的viewmodel,因为默认数据上下文是父控件或父数据上下文,在本例中是您的布局根。
请参阅this
和this
我希望这有帮助。 问候。
答案 2 :(得分:0)
我使用了这篇文章中描述的BindableProxy版本: http://weblogs.asp.net/dwahlin/archive/2009/08/20/creating-a-silverlight-datacontext-proxy-to-simplify-data-binding-in-nested-controls.aspx
在Grid上方(可能在UserControl.Resources中),您将创建:
<UserControl.Resources>
<ns:BindableProxy x:Key="BindableProxy" />
<UserControl.Resources>
然后,在按钮绑定中:
<Button Command="{Binding DataSource.MyCommand, Source={StaticResource BindableProxy}}" />