UserControl.Resources /获取参考视图模型

问题描述:

我实例化我的虚拟机是这样的:UserControl.Resources /获取参考视图模型

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}" 

我似乎总是有麻烦保证我开始在合适的范围内当我指定我的数据绑定时,这个语法将确保根目录是稳定的。恕我直言

我哪里错了?

Dan Wahlin有一个非常类似的问题,并希望简化绑定到父控件的DataContext,并提出了这个美:DataContextProxy。当我试图实例化一个类并获得引用时(就像通过DataContext属性获得对类的引用一样),Dan采用了另一个路由并允许DataContext创建并获取对实例化类的引用。正如他在他的文章中所描述的那样,他创建了一个引用父对象的DataContext属性的类,并在User.Resources引用(因此是Proxy后缀!)中公开该引用。然后绑定可以通过简单地使用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);