UserControl.Resources /获取对ViewModel的引用

时间:2011-06-12 19:45:20

标签: xml silverlight mvvm

我像这样实现我的虚拟机:

DataContext="{Binding Source={StaticResource ViewModelLocatorService}, Path=FlowDateRatchetViewModel}"

哪个好,但是当我绑定到我的命令时,我通常会这样做:

Command="{Binding ElementName=ucFlowDateRatchets, Path=DataContext.AddFlowDateRatchetCommand}"

当我在模板中时,我必须做的事情是因为DataContext在ViewModel中,这允许我从顶部开始。

有没有办法做类似的事情:

<UserControl.Resources>
    <VM:FlowDateRatchet x:key="FlowDateRatchetViewModel" Constructor?????={Binding....
</UserControl.Resources>

这样命令就是:

Command="{Binding Source={StaticResource FlowDateRatchetViewModel}, Path=AddFlowDateRatchetCommand}"

当我指定数据绑定时,我似乎总是难以确保我从正确的上下文开始,这种语法将确保root是稳定的。 IMHO

我哪里错了?

1 个答案:

答案 0 :(得分:0)

Dan Wahlin有一个非常简单的问题,并希望简化与父控件的DataContext的绑定,并提出了这个美:DataContextProxy。当我试图实现一个类并获得参考时(就像你通过DataContext属性获得对类的引用一样),Dan采用了另一种方法并允许DataContext创建并获得对instanciated类的引用。正如他在文章中描述的那样,他创建了一个引用父对象的DataContext属性的类,并在User.Resources引用中公开该引用(因此代理后缀!)。然后,绑定可以通过简单地使用StaticReference绑定属性来获得引用。

我通过以下方式完成同样的事情:1)命名UserControl,并使用ElementName属性(缺点是您已经命名了UC,并且多次使用相同的UC会导致页面上出现重复的名称),或者2)在SL5中使用RelativeSource,并通过AncestorType,将其指向UserControl。两者都很长,需要路径为Path =“DataContext”。我很讨厌。

仍在尝试,但我认为这样可以很好地完成这项工作,并确保绑定的清晰度。

我做了一个小改动,并通过一个弱引用撒了一点RX爱来订阅一个事件:

Observable.FromEvent<RoutedEventArgs>(this,"Loaded")
          .Subscribe(pEvent => DataContextProxy_Loaded(pEvent.Sender, pEvent.EventArgs));

而不是

this.Loaded += new RoutedEventHandler(DataContextProxy_Loaded);