从视图模型获取窗口

30 浏览
0 Comments

从视图模型获取窗口

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

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

因此,当从视图模型调用我的自定义messageBox时,我需要获取窗口并将其传递。如何获取与视图模型关联的窗口呢?

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

我正在使用Visual Studio 2008。

尝试 #1: mm8的解决方案


    
        
    
    
    

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

0
0 Comments

问题的出现原因是,在这个例子中,view model 需要获取与之关联的 Window 对象。然而,由于 MVVM 模式的限制,view model 不能直接访问 Window 对象。

解决方法是,通过在 view model 中注入一个由 Window 实现的接口 IView。然后,在 MainWindow 类中实现该接口,并将实例传递给 view model。这样,view model 就可以通过 IView 接口来访问与之关联的 Window 对象。

如果想要一个简单粗暴、不符合 MVVM 的快捷方法,可以使用 Application.Current.MainWindow 来获取当前的 Window 对象。

另外,也可以通过创建一个工厂类来创建 view 和 view model,并在工厂类中设置 datacontext。这样可以更好地解耦代码。

最后,还提供了一个例子来演示如何在工厂类中创建 view 和 view model,并设置 datacontext。

public class ViewFactory
{
    public MainWindow CreateMainWindow()
    {
        MainWindow mainWindow = new MainWindow();
        ViewModel viewModel = new ViewModel();
        mainWindow.DataContext = viewModel;
        return mainWindow;
    }
}

通过以上方法,问题得到了解决。

0