从视图模型获取窗口

use*_*552 3 c# wpf mvvm

我创建了一个自定义messageBox窗口来替换典型的MessageBox。

我的自定义messageBox(子窗口)需要将父窗口作为参数传递。父窗口是子窗口将在指定位置(左上角,居中居中等)内作为参数的位置。

因此,当从视图模型调用我的自定义messageBox时,我需要让Window传递它。如何获得与视图模型关联的窗口?

也许使用像这里评论的接口?我正在尝试实现它,但是this.DataContext.View不存在。

我正在使用Visual Studio 2008。

ATTEMPT#1:mm8解决方案

<Window x:Class="MyNamespace.Main"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:viewmodel="clr-namespace:MyNamespace.ViewModels">
    <Window.Resources>
        <viewmodel:MainViewModel x:Key="wMainViewModel" />
    </Window.Resources>

    <Grid DataContext="{StaticResource wMainViewModel}">
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

考虑到我是从xaml初始化DataContext的,而不是从构造函数的代码隐藏的,所以如何将视图传递给视图模型?

mm8*_*mm8 5

如何获得与视图模型关联的窗口?

您可以使用窗口实现的接口注入视图模型:

public interface IView
{
    double Top { get; }
    double Left { get; }
    double Height { get; }
    double Width { get; }
}

public partial class MainWindow : Window, IView
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel(this);
    }
}

public class ViewModel
{
    private readonly IView _view;

    public ViewModel(IView view)
    {
        _view = view;
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

然后,视图模型只知道一个接口(可能应该将其称为IView之外的其他名称)。

如果您想要一个丑陋且非MVVM友好的快捷方式,则可以使用此类Application

var win = Application.Current.MainWindow;
Run Code Online (Sandbox Code Playgroud)

创建所有内容的工厂类:

public MainWindow WindowFactory()
{
    MainWindow mainWindow = new MainWindow();
    ViewModel viewModel = new ViewModel();
    mainWindow.DataContext = viewModel;

    return mainWindow;
}
Run Code Online (Sandbox Code Playgroud)

  • 你不能 在XAML中创建视图模型不是一个好主意,尤其是在这种情况下。而是在后面的代码中创建它。 (2认同)