0

重複の可能性:
WPF MVVM 初心者 - ViewModel はどのようにフォームを閉じる必要がありますか?

私はstackoverflowを検索しましたが、与えられた答えが私のものに当てはまるとは思わないか、それらを適用する方法を理解できません。

ボグ標準のMVVM WPFアプリケーションがあります。MVVM パーツは、RelayCommand クラスと、ViewModelBase クラスおよび ViewModelBase を拡張する WorkspaceViewModel クラスで構成されます。

MainWindow と CustomMessageBox ウィンドウ (実際にはユーザーに質問と 2 つの回答を提供します) の 2 つのウィンドウがあります。MainWindow で次のコードを使用して、CustomMessageBox (2 番目のウィンドウ) を開きます。

public ICommand BrowseFileFolderCommand
    {
        get
        {
            if (_browseFileFolderCommand == null)
            {
                _browseFileFolderCommand = new RelayCommand(o =>
                    {
                        var messageViewModel = new MessageBoxViewModel("Add a Folder or File", "What do you wish to add, folder or file?", "Folder", "File");
                        var choice = new CustomMessageBox()
                        {
                            DataContext = messageViewModel
                        };
                        choice.ShowDialog();

                        if (messageViewModel.CustomMessageBoxDialogResult == DialogResult.Yes)
                        {
                            switch (messageViewModel.ChosenEntity)
                            {
                                case SelectedAnswer.Answer1:
                                    // Get folder shizz
                                    break;
                                case SelectedAnswer.Answer2:
                                    // Get file shizz
                                    break;
                                default:
                                    break;
                            }
                        }
                    }, null);
            }
            return _browseFileFolderCommand;
        }
    }

CustomMessageBox が起動されると、CloseCommand で閉じることができません。CustomMessageBox の読み込みをデバッグしようとすると、何かを押す前にすべての ICommand が起動されているように見えますか?

WorkspaceViewModel には CloseCommand があります。

 #region CloseCommand

    /// <summary>
    /// Returns the command that, when invoked, attempts
    /// to remove this workspace from the user interface.
    /// </summary>
    public ICommand CloseCommand
    {
        get
        {
            if (_closeCommand == null)
                _closeCommand = new RelayCommand(param => this.OnRequestClose());

            return _closeCommand;
        }
    }

    #endregion // CloseCommand

    #region RequestClose [event]

    /// <summary>
    /// Raised when this workspace should be removed from the UI.
    /// </summary>
    public event EventHandler RequestClose;

    void OnRequestClose()
    {
        EventHandler handler = this.RequestClose;
        if (handler != null)
            handler(this, EventArgs.Empty);
    }

    #endregion // RequestClose [event]

誰かアイデアはありますか?何か重要なことを忘れていませんか?

ありがとう、

4

2 に答える 2

1

Command.Executeこれを達成する必要がある場合は、ロジックから次のコード行を呼び出します。

App.Current.Windows.Cast<Window>().Where(win => win is CustomMessageBox).FirstOrDefault().Close();

これが役立つことを願っています。

于 2012-11-26T13:42:47.147 に答える
1

実はイベントハンドラにメソッドをつけていなかったので、イベントハンドラを呼んでもコードが行き詰って何もできなかったので、コードを変更してイベントにウィンドウのCloseメソッドをつけました。 ViewModel のハンドラ:

messageViewModel.RequestClose += (s, e) => choice.Close();

完全なコードは次のとおりです。

public ICommand BrowseFileFolderCommand
{
    get
    {
        if (_browseFileFolderCommand == null)
        {
            _browseFileFolderCommand = new RelayCommand(() =>
                {
                    var messageViewModel = new MessageBoxViewModel("Add a Folder or File", "What do you wish to add, folder or file?", "Folder", "File");
                    var choice = new CustomMessageBox()
                    {
                        DataContext = messageViewModel
                    };
                    // Added this line
                    messageViewModel.RequestClose += (s, e) => choice.Close();
                    choice.ShowDialog();

                    if (messageViewModel.CustomMessageBoxDialogResult == DialogResult.Yes)
                    {
                        switch (messageViewModel.ChosenEntity)
                        {
                            case SelectedAnswer.Answer1:
                                // Get folder shizz
                                break;
                            case SelectedAnswer.Answer2:
                                // Get file shizz
                                break;
                            default:
                                break;
                        }
                    }
                }, null);
        }
        return _browseFileFolderCommand;
    }
}

答えを得るのを手伝ってくれてありがとう、これは特に私の問題を明確にするためです。

ありがとう。

于 2012-11-26T15:04:49.113 に答える