我有一个名为MainWindowViewModel的ViewModel。在这里我有一个属性,显示错误发生时的模态窗口。只要在启动期间发生错误,这种方法就可以正常工作。
启动后发生错误时,在SubViewModel中,我调用MainWindowViewModel中的参数化构造函数。
MainWindowViewModel.cs
public MainWindowViewModel()
{
if (!isServerRunning)
{
this.ModalWindow = new LogViewModel("Server is down.");
}
else
{
this.ModalWindow = new LogViewModel();
}
}
public MainWindowViewModel(string logMessage)
{
this.ModalWindow = new LogViewModel(logMessage);
}
public LogViewModel ModalWindow
{
get
{
return _modalWindow;
}
set
{
_modalWindow = value;
OnPropertyChanged("ModalWindow");
}
}
MainWindow.xaml
...
<Grid>
<vw:LogView Content="{Binding Path=ModalWindow}"/>
</Grid>
MainWindowViewModel绑定到MainWindow.xaml
SubViewModel绑定到SubView.xaml
MainWindow.xaml加载多个视图,其中一个是SubView。
在 App.xaml 中,我创建了一个ViewModel实例并将其绑定到MainWindow。
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainWindow mainWindow = new MainWindow();
MainWindowViewModel viewModel = new MainWindowViewModel();
mainWindow.DataContext = viewModel;
mainWindow.Show();
}
我意识到如果我在SubViewModel中创建模态窗口属性并将其绑定到SubView,则启动后发生错误时会出现模态窗口。但这不行,因为SubView只是一个覆盖MainWindow 1/4的DockPanel。即1/4仅覆盖模态窗口而不是整个MainWindow。
当我从SubViewModel调用参数化构造函数时,我不确定为什么模态窗口不会出现在MainWindow中。当我调试时,我看到部件_modalWindow = value;
具有正确的值,但无论如何都没有出现模态窗口。
我将ViewModel绑定到MainWindow的Datacontext。这可能是我在启动时发生错误时看到Modal窗口的原因。对于启动后的错误:我必须(从SubViewModel调用MainWindowViewModel中的参数化构造函数)再次对Mainwindow的datacontext进行某种绑定吗?如何在不创建MainWindow新实例的情况下实现这一目标的最佳方法是什么?因为MainWindow只能创建一次。
非常感谢任何帮助。
答案 0 :(得分:0)
每次出现错误时,您似乎都在重新创建ViewModel。如果是这样,您还需要在视图中重置绑定,这将破坏MVVM的目的。 而是拥有ViewModel的一个实例,并使用OnPropertyChanged()将错误传播到View。
当然有很多方法可以做到这一点,但我通常在视图中保留对ViewModel的引用,然后在ViewModel中引用Model。这样,Model与View / ViewModel完全分离,同样ViewModel与View分离。
答案 1 :(得分:0)
您不应该反复创建MainWindowViewModel。它应该被创建一次并设置为主窗口的datacontext。
问题在于您要显示对话框的方法。这使事情变得复杂。
显示对话框的最佳解决方案是使用mvvmlight toolkit的messenger。查看this以获取有关其使用情况的一些提示。
这是你可以使用mvvmlight toolkit的messenger来显示对话框的方法:
查看:
Messenger.Default.Register<DialogMessage>(
view,
msg =>
{
var result = MessageBox.Show(
msg.Content,
msg.Caption,
msg.Button,
msg.Icon);
}
);
视图模型:
private void ShowMessageBox(string msgStr, string capStr, MessageBoxButton btn, MessageBoxImage img)
{
var message = new DialogMessage(msgStr, null)
{
Button = btn,
Caption = capStr,
Icon = img
};
Messenger.Default.Send(message);
}
从任何viewmodel调用上面的方法(ShowMessageBox)来显示一个对话框。