【问题标题】:How can I share a ViewModel between parent/child Views (Silverlight 3.0)?如何在父/子视图(Silverlight 3.0)之间共享 ViewModel?
【发布时间】:2010-07-12 21:50:56
【问题描述】:

我有一个通过 xaml 绑定到 ViewModel 的父视图(视图模型在 xaml 中声明)。

然后这个父视图可以显示一个子视图(通过 NavigationService,又名导航:框架)。

父视图永远不会超出范围,但我希望新的子视图共享父视图模型。

我该怎么做?因为通过在子视图的 xaml 中声明相同的视图模型意味着子视图将获得它自己的视图模型实例(即它与父视图不同的视图模型实例)。

谢谢!

【问题讨论】:

    标签: silverlight views viewmodel sharing


    【解决方案1】:

    听起来是 (a) 使用 MEF 的绝佳机会。导出视图模型,然后在父视图和子视图中导入它。默认情况下,它们将共享同一个对象。或者 (b) 创建一个跟踪视图模型实例的定位器类,通过静态属性公开,并使用该静态属性检索父级和子级中的视图模型:

    public static class Locator 
    {
       private static readonly MyViewModel _instance = new MyViewModel();
    
       public static MyViewModel Instance 
       {
          get { return _instance; }
       }
    }
    
    public partial class MyView
    {
        public MyView()
        {
           InitializeComponent();
           LayoutRoot.DataContext = Locator.Instance;
        }
    }
    

    【讨论】:

      【解决方案2】:

      好吧,直到有人给我一个好的答案,我将使用以下解决方案(如果它有效,因为我还没有真正测试过)。

      我的破解方案:

      ViewModel 将拥有对其自身的公共静态引用。 然后子视图将其 DataContext 设置为 ViewModel 的静态引用。

      干杯。

      【讨论】:

        【解决方案3】:

        子视图从其父视图继承其DataContext,无需再次声明或分配。

        【讨论】:

        • 抱歉,它不是其父级的真正子级。我应该说它是一个子视图(即由其父视图创建/拥有的视图)。这里没有继承。
        猜你喜欢
        • 2011-05-24
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 2011-10-26
        • 1970-01-01
        • 2019-07-02
        相关资源
        最近更新 更多