如何使用 ViewModelLocator 创建非键控、非缓存的视图模型

How to create non keyed, non cached viewmodel using ViewModelLocator

我在一个简单的 WPF 应用程序中使用 MVVM Light。我知道 ViewModelLocator class 可用于创建缓存的视图模型对象,无论是否有键。但是,我希望能够创建一个未缓存或键控的视图模型。让我详细说明。

我的应用程序中有一个新对话框。该对话框包含一个 ComboBox,其中包含一个选项列表、一个确定按钮和一个取消按钮。我尝试将 属性 添加到新对话框的视图模型对象的 ViewModelLocator 中,如下所示:

public NewObjectViewModel NewObject {
    get { return ServiceLocator.Current.GetInstance<NewObjectModel>(); }
}

这行得通,但是如果我打开新对话框一次,做出选择并单击“确定”,然后稍后再次打开它,则用户之前的选择已经被选中。这不是我想要的。我希望新对话框每次打开时都处于完全相同的初始状态。

我是否只需将对 ServiceLocator.Current.GetInstance<NewObjectModel>() 的调用替换为对 new NewObjectModel() 的调用?还是我需要使用不同的 ServcieLocator.Current 调用?

这是一个简单的例子,因为这个视图模型 class 的构造函数没有参数。我有另一个对话框将 IDataService 引用作为参数。它有第二个参数,是一个 MyModel 对象。似乎整个模式在这种情况下不起作用,因为您无法将模型对象传递到 属性,并且模型对象是 MainViewModel [的 属性 class.

这两种情况如何正确使用ViewModelLocator

编辑:

我进行了更多搜索,发现 SimpleIoc class 有一个 GetInstanceWithoutCaching<T>() 方法,适用于我的新对话框。这就是问题的一半。

但是对于构造函数将模型对象作为参数的视图模型 class,我该如何处理使用 ViewModelLocator 创建新视图模型的情况?

我已经找到了解决我的问题的有效且非常优雅的方法。

首先,正如我在对问题的编辑中所说,我在 MVVM Light SimpleIoc class 中找到了 GetIntanceWithoutCaching<T>() 方法。此方法创建一个新的 class 实例,其类型在每次调用时传入 T

其次,我发现 this blog post 它描述了子对话框的视图模型将消息发送回主视图模型的过程,该消息请求接收方向其发送所需的模型对象。以下是我必须对代码进行的所有更改才能使其正常工作。

首先,我创建了一条新消息class:

public class GetMyModelMessage : MessageBase {

    public Action<MyModel> Callback { get; private set; }

    public GetMyModelMessage( Action<MyModel> callback ) {
        Callback = callback;
    }
}

然后,在 MainViewModel 中:

public MainViewModel() {
    // Existing initialization code

    Messenger.Default.Register<GetMyModelMessage>( this, SendMyModel );
}

private void SendMyModel( GetMyModelMessage message ) {
    message.Callback( MyModelProperty );
}

在子视图模型的构造函数中 window:

public ChildViewModel() {
    // Existing initialization

    Messenger.Default.Send( new GetMyModelMessage( m => MyModelProperty = m );
}

最后,在 ViewModelLocator:

public ChildViewModel Child {
    get { return SimpleIoc.Default.GetInstanceWithoutCaching<ChildViewModel>(); }
}

通过所有这些更改,子 window 的 XAML 现在可以像主 window 一样设置 DataContext,一个新的视图模型因为它是由 ViewModelLocator 创建的,当创建子 window 时,子视图模型会发送一个模型对象显示请求。子视图模型不知道谁来处理消息,只是通过消息中的回调获取一个对象来显示。