【问题标题】:UserControl.Resources / Obtain Reference to ViewModelUserControl.Resources / 获取对 ViewModel 的引用
【发布时间】:2023-03-27 23:54:01
【问题描述】:

我这样实例化我的虚拟机:

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

当我指定我的数据绑定时,我似乎总是无法确保从正确的上下文开始,而这种语法将确保根是稳定的。恕我直言

我哪里出错了?

【问题讨论】:

    标签: xml silverlight mvvm


    【解决方案1】:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多