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

时间:2012-04-12 20:33:50

标签: silverlight data-binding

我正在使用 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中使用它。

由于

3 个答案:

答案 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}}" />