我想显示一个窗口以根据用户填写的表单创建对象。
我现在做的是从我的主视图模型中,我实例化我的表单窗口,将其数据上下文设置为相应视图模型类的新实例并获取 ShowDialog()
var addLicWnd = new AddLicenseWindow();
if (addLicWnd.ShowDialog() ?? false)
{
var x = ((AddLicenseWindowViewModel)addLicWnd.DataContext).dialogResult;
//dialogResult is a property I set in my VM to get the data back when the form closes
}
此 ViewModel 公开了一个 dialogResult 属性,以将数据从表单返回到我的主 ViewModel,然后我将其添加到 DB 等中......
我的问题是,例如,我无法通过按下按钮关闭其中的表单。
我发现的是一个类似问题的答案(https://stackoverflow.com/a/3329467/9734355)但我发现使用它的唯一方法是调用这个以窗口为参数的 SetDialogResult 方法。这意味着我需要在我的 ViewModel 中引用我的视图,从而破坏 MVVM(或者我错过了什么?)
所以它看起来像
主视图模型
var addLicWnd = new AddLicenseWindow();
addLicWnd.Datacontext = new AddLicenseWindowViewModel(addLicWnd);
if (addLicWnd.ShowDialog() ?? false)
{
var x = ((AddLicenseWindowViewModel)addLicWnd.DataContext).dialogResult;
}
表单视图模型
public Window window;
public event PropertyChangedEventHandler PropertyChanged;
public LicenseRecordModel dialogResult;
//Commands and OnPropertyChanged...
public AddLicenseWindowViewModel(Window w)
{
window = w;
}
private void ButtonClick(){
dialogResult = new LicenseRecordModel("b", "b", "b", "b", "b");
//...
DialogCloser.SetDialogResult(wnd, true);
}
这可行,但对我来说看起来不符合 MVVM,我该怎么办?我误解了答案吗?