在其上载事件WPF中停止呈现窗口

时间:2018-08-03 05:15:49

标签: c# wpf

我定义了一个View作为SubWindow类的实例,其定义如下

public partial class SubWindow : Window
{
    public SubWindow(BaseViewModel vm)
    {
        InitializeComponent();
        this.Loaded += OnLoaded;
        vm.CloseWindow += (s, e) => this.Close();
        vm.Hide += (s, e) => this.Hide();
        this.Content = vm;
        this.DataContext = vm;
    }

    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        BaseViewModel vm = DataContext as BaseViewModel;
        if (vm != null)
        {
            vm.OnInitDialog()
        }
    }
}

这是我的ViewModel基类

public class BaseViewModel() // implements INotifyPropertyChanged
{   
    public event EventHandler CloseWindow;

    public virtual bool OnInitDialog()
    {        
    }


    public virtual void OnCancel(object param)
    {
        CloseWindow(null, null);
    }
}

然后是我的具体ViewModel类

public class MyViewModel : BaseViewModel
{
    public MyViewModel() 
    {
        // Init ViewModels
    }
    public bool OnInitDialog()
    {

        if(check()) 
        {
           OnCancel(null);
           return false;
        }
        return true;
    }
}

这是我显示窗口的方式

MyViewModel vm = new MyViewModel();
Window window = new SubWindow(vm);
window.ShowDialog();

加载窗口时,会引发OnLoaded事件。

在OnLoaded事件内部,它将调用ViewModel的OnInitDialog方法。

问题出在OnInitDialog()内部,如果check()返回true,则将调用OnCancel(),后者又调用ViewModel的CloseWindow()和View的Close()。

换句话说,Window的Close()在其ShowDialog()内部被调用,在我看来这不是一个好习惯。

有时,如果该解决方案以发布模式构建,则会引发异常。

所以我的问题是如何在加载窗口后停止渲染窗口。

0 个答案:

没有答案