如何将ViewModel指定给XAML窗口?

如何将ViewModel指定给XAML窗口?,xaml,binding,dependency-injection,Xaml,Binding,Dependency Injection,我正在尝试在XAML窗口之间共享ViewModel。这是允许对象实例的多个视图从ViewModel接收事件所必需的 在XAML中将ViewModel指定为资源,然后在替代构造函数中覆盖它是不起作用的。绑定仍将绑定到默认构造函数中创建的默认实例,并且不会从相应实例接收事件或更新相应实例 这不起作用: MyWindow.xaml: <Window x:Class="MyNamespace.MyWindow" xmlns="http://schemas.microsoft.com/win

我正在尝试在XAML窗口之间共享ViewModel。这是允许对象实例的多个视图从ViewModel接收事件所必需的

在XAML中将ViewModel指定为资源,然后在替代构造函数中覆盖它是不起作用的。绑定仍将绑定到默认构造函数中创建的默认实例,并且不会从相应实例接收事件或更新相应实例

这不起作用:

MyWindow.xaml:

<Window x:Class="MyNamespace.MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyNamespace"
    Title="My Window"
    Width="700" Height="550">
<Window.Resources>
    <local:MyViewModel x:Key="MyModel"/>
</Window.Resources>
    <ContentPresenter Content="{StaticResource MyModel}"/>
</Window>
<Window x:Class="MyNamespace.MyWindow"
    x:Name="this"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyNamespace"
    Title="My Window"
    Width="700" Height="550">
    <ContentPresenter Content="{Binding MyModel, ElementName=this}"/>
</Window>
这也不会:

MyWindow.xaml.cs

imports ...;

namespace MyNamespace {
    public partial class MyWindow {

        public MyWindow() {
            InitializeComponent();
        }

        public MyWindow(MyViewModel model)
                : this() {
            Resources["MyModel"] = model;
        }
    }
}
imports ...;

namespace MyNamespace {
    public partial class MyWindow {

        public MyWindow()
                : this(new MyViewModel()) { }

        public MyWindow(MyViewModel model) {
            Resources["MyModel"] = model; // Resources not yet initialized!
            InitializeComponent();
        }
    }
}
imports ...;

namespace MyNamespace {
    public partial class MyWindow {

        public MyViewModel MyModel { get; private set; }

        public MyWindow()
                : this(new MyViewModel()) { }

        public MyWindow(MyViewModel model) {
            MyModel = model;
            InitializeComponent();
        }
    }
}

MyThis可以通过在代码隐藏中使用属性并在XAML中使用绑定标记而不是StaticResource来完成,如下所示:

MyWindow.xaml:

<Window x:Class="MyNamespace.MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyNamespace"
    Title="My Window"
    Width="700" Height="550">
<Window.Resources>
    <local:MyViewModel x:Key="MyModel"/>
</Window.Resources>
    <ContentPresenter Content="{StaticResource MyModel}"/>
</Window>
<Window x:Class="MyNamespace.MyWindow"
    x:Name="this"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyNamespace"
    Title="My Window"
    Width="700" Height="550">
    <ContentPresenter Content="{Binding MyModel, ElementName=this}"/>
</Window>
多个窗口(或其他组件)可以使用同一个模型实例

2012年12月6日编辑:
XAML不正确,绑定无法工作。向根元素(窗口)添加了x:Name属性,并向绑定元素(ContentPresenter)的Content属性添加了ElementName参数.

如果您使用的是Microsoft.Practices.Unity,则可以使用。它将确保仅创建viewmodel的一个对象。

当项目需要某种DI框架时,这是更好的解决方案。在我的情况下,使用DI框架可能会有些过分。