0

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

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

这不起作用:

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>

MyWindow.xaml.cs

imports ...;

namespace MyNamespace {
    public partial class MyWindow {

        public MyWindow() {
            InitializeComponent();
        }

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

这也不会:

MyWindow.xaml.cs

imports ...;

namespace MyNamespace {
    public partial class MyWindow {

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

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

2 回答 2

1

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

于 2012-12-02T14:01:39.423 回答
0

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

MyWindow.xaml:

<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 MyViewModel MyModel { get; private set; }

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

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

多个窗口(或其他组件)可以使用相同的模型实例。

2012 年 12 月 6 日编辑: XAML 不正确,绑定不起作用。将 x:Name 属性添加到根元素 (Window),并将 ElementName 参数添加到绑定元素 (ContentPresenter) 的 Content 属性。

于 2012-11-30T23:16:48.667 回答