我有一个父视图,它被 xaml 绑定到 ViewModel(视图模型在 xaml 中声明)。
然后这个父视图可以显示一个子视图(通过 NavigationService,又名导航:框架)。
父视图永远不会超出范围,但我希望新的子视图共享父视图模型。
我怎样才能做到这一点?因为通过在子视图的 xaml 中声明相同的视图模型将意味着子视图获得它自己的视图模型实例(即,它与父视图不同的视图模型实例)。
谢谢!
我有一个父视图,它被 xaml 绑定到 ViewModel(视图模型在 xaml 中声明)。
然后这个父视图可以显示一个子视图(通过 NavigationService,又名导航:框架)。
父视图永远不会超出范围,但我希望新的子视图共享父视图模型。
我怎样才能做到这一点?因为通过在子视图的 xaml 中声明相同的视图模型将意味着子视图获得它自己的视图模型实例(即,它与父视图不同的视图模型实例)。
谢谢!
听起来是(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;
}
}
好吧,直到有人给我一个好的答案,我将使用以下解决方案(如果它有效,因为我还没有真正测试过它)。
我的黑客解决方案:
ViewModel 将拥有对其自身的公共静态引用。然后子视图将其 DataContext 设置为 ViewModel 的静态引用。
干杯。
子视图从其父视图继承其 DataContext,无需再次声明或分配它。