从视图模型获取窗口

时间:2017-11-13 14:05:41

标签: c# wpf mvvm

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

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

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

也许使用像评论here这样的界面?我试图实现它,但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>

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

1 个答案:

答案 0 :(得分:4)

  

如何让Window与视图模型相关联?

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

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;
    }

    //...
}

然后视图模型只知道一个接口(可能应该被称为除IView以外的其他接口)。

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

var win = Application.Current.MainWindow;

创建一切的工厂类:

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

    return mainWindow;
}