我正在启动一个包含UserControl的窗口,我想从UserControl的ViewModel中关闭该窗口。坚持使用MVVM的最佳方式是什么?
理想情况下,我想在关闭窗口时使用IsCancel调用与Button相同的命令。我没有与取消按钮绑定的代码,它可以完美关闭窗口。
这就是我目前正在做的...
我从MainWindowViewModel使用UserControl启动窗口,然后将MainWindowViewModel传递给UserControl的ViewModel,如下所示:
Window window = new Window
{
Title = "Sign In",
Height = 350,
Width = 500,
WindowStartupLocation = WindowStartupLocation.CenterScreen,
WindowStyle = WindowStyle.ToolWindow,
ResizeMode = ResizeMode.NoResize,
Content = new SignIn(mainWindowViewModel: this)
};
window.ShowDialog();
我只是不太确定如何从UserControl的ViewModel中关闭窗口。
答案 0 :(得分:0)
在此处填充很多空白,但假设“ SignIn”是您的视图模型,则可以传递一个Action /回调,您的SignIn视图模型可以调用该操作/回调来关闭窗口:
Window window = new Window
{
Title = "Sign In",
Height = 350,
Width = 500,
WindowStartupLocation = WindowStartupLocation.CenterScreen,
WindowStyle = WindowStyle.ToolWindow,
ResizeMode = ResizeMode.NoResize,
};
window.Content = new SignIn(mainWindowViewModel: this,
closeWindowAction: (isCancelled) =>
{
window.DialogResult = !isCancelled;
window.Close();
});
window.ShowDialog();
因此您可以在视图模型之间保持某种程度的松散耦合,并假设SignIn VM类看起来像这样:
public class SignIn
{
private readonly Action<bool> _closeWindowAction;
public SignIn(MainWindowViewModel mainWindowViewModel, Action<bool> closeWindowAction)
{
_closeWindowAction = closeWindowAction;
}
public void CloseWindow(bool isCancelled)
{
_closeWindowAction.Invoke(isCancelled);
}
}
尽管如此,我不清楚您为什么将MainWindowViewModel传递到SignIn视图模型中。
如果您想在MVVM方面保持真正的整洁,那么我倾向于创建一个IDialogService
接口,该接口可用于在我的视图模型中显示消息框,模态等-委托创建和管理Window
中该服务的某些实现。最终结果是视图模型不知道如何显示模式或对话框。
如果您有兴趣-可以使用诸如https://github.com/FantasticFiasco/mvvm-dialogs之类的库,也可以自己滚动。