在为表单关闭实现WPF MVVM模式时,获取"只能在创建Window并显示为对话框后才能设置DialogResult"

luq*_*uqi 23 .net wpf

我正在尝试为WPF表单关闭实现 MVVM模式,这也在本博客中进行了解释,我收到System.InvalidOperationException,错误消息"只有在创建Window并显示为对话框后才能设置DialogResult".当我尝试在关闭按钮命令上设置对话框结果时:

DialogResult = true;
Run Code Online (Sandbox Code Playgroud)

这是我的ViewModel:

class MainWindowViewModel:INotifyPropertyChanged
{
    private bool? dialogResult;
    public bool? DialogResult
    {
        get { return dialogResult; }
        set
        {
            if (value != this.dialogResult)
            {
                this.dialogResult = value;
                OnPropertyChanged("DialogResult");
            }
        }
    }

    public string Text
    {
        get { return "Hello!"; }
    }

    void CloseCommandExecute()
    {
        this.DialogResult = true;
    } 
Run Code Online (Sandbox Code Playgroud)

这是XAML视图:

<Window x:Class="WpfApplication.Mvvm.Windowclosing.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication.Mvvm.Windowclosing"
        local:DialogCloser.DialogResult="{Binding DialogResult}"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="100"/>
            <RowDefinition Height="40"/>
        </Grid.RowDefinitions>
        <TextBlock Text="{Binding Text}" Grid.Row="0"/>
        <Button Grid.Row="1" Command="{Binding CloseCommand}">Close Me</Button>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

小智 23

设置对话框结果仅在使用ShowDialog()打开表单时有效.当您尝试在使用Show()打开的窗体上设置对话框结果时,会出现此错误.

  • 在我的例子中,我设置`DialogResult = false;`作为初始化,在测试逻辑之后,我设置`DialogResult = true;`.这是问题的根源.你**不能**设置`DialogResult`两次!此外,`DialogResult = true; DialogResult = true;`也引发异常:-) (12认同)
  • @Sonhja我认为IsCancel或IsDefault属性会导致此问题. (2认同)

Unp*_*lug 16

当我创建一个被调用的窗口时,我遇到了这个问题ShowDialog().在窗口中,我有一个Ok_Clicked包括一堆语句.为了'保证',如果有任何错误,对话框返回false我首先将其初始化DialogResult为false.如果一切正常,我会设置DialogResult为true并关闭窗口.我一直得到同样的例外.

我了解到,如果DialogResult未设置为true,则ShowDialog总是返回false.当我DialogResult = false在开头删除时Ok_Clicked,我不再得到例外.


Jar*_*vis 9

我遇到了一个可以帮助别人的替代答案.在设置DialogResult之前,我最终在窗口上调用了Close().确保你不这样做 - 它会导致这个错误.


Iev*_*ida 6

对于使用ShowDialog的用户,您可以从按钮中删除属性:

IsCancel = true且 IsDefault = true

  • 但是Escape和Enter键不会激活取消或默认按钮,就像用户可能期望的那样. (5认同)