我创建了一个自定义的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而不是构造函数中的代码隐藏,我如何将视图传递给视图模型?
答案 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;
}