我创建了一个自定义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的,而不是从构造函数的代码隐藏的,所以如何将视图传递给视图模型?
如何获得与视图模型关联的窗口?
您可以使用窗口实现的接口注入视图模型:
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)
| 归档时间: |
|
| 查看次数: |
3975 次 |
| 最近记录: |