ホームページ >バックエンド開発 >C++ >MVVM の ViewModel から WPF フォームを閉じるにはどうすればよいですか?

MVVM の ViewModel から WPF フォームを閉じるにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-23 02:51:09293ブラウズ

How to Close a WPF Form from the ViewModel in MVVM?

WPF の MVVM 設計パターンでの共通の課題は、ViewModel からビュー (フォームなど) をどのように閉じるかです。通常、ViewModel はビジネス ロジックの管理を担当し、ビューはユーザー インターフェイス (UI) の表示を担当します。

問題: ViewModel にビューの知識がありません

仕様上、ViewModel は View を直接認識すべきではありません。これにより、懸念事項が確実に分離され、UI の独立性が確保されます。ただし、フォームを閉じるにはビューにアクセスする必要があるため、問題が発生する可能性があります。

一般的なソリューション

従来の分離コード方式: これには、フォームを閉じるためのコードをビューの分離コード ファイルに配置することが含まれます。これは MVVM パターンに違反し、ビューと ViewModel の間に結合が生じます。

スタイルトリガーを備えた追加のプロパティ: フォームに添付プロパティを定義し、添付プロパティが設定されたときにスタイル トリガーを使用してフォームを閉じることができます。このソリューションは MVVM の原則に準拠していますが、追加のコードが必要となり、煩雑になる可能性があります。

簡略化されたソリューション: DialogCloser の追加属性

このプロセスを簡素化するために、DialogCloser というカスタム添付プロパティを作成できます。このプロパティは、フォームの DialogResult を表す bool? パラメータを取ります。このプロパティの値が設定されると、フォームを含む Window オブジェクトの DialogResult プロパティが自動的に設定されます。

<code class="language-csharp">public static class DialogCloser
{
    public static readonly DependencyProperty DialogResultProperty =
        DependencyProperty.RegisterAttached(
            "DialogResult",
            typeof(bool?),
            typeof(DialogCloser),
            new PropertyMetadata(DialogResultChanged));

    private static void DialogResultChanged(
        DependencyObject d,
        DependencyPropertyChangedEventArgs e)
    {
        var window = d as Window;
        if (window != null)
            window.DialogResult = e.NewValue as bool?;
    }
    public static void SetDialogResult(Window target, bool? value)
    {
        target.SetValue(DialogResultProperty, value);
    }
}</code>

この属性を使用するには、XAML ビューの Window 要素に適用するだけです。

<code class="language-xml"><Window ... xc:DialogCloser.DialogResult="{Binding DialogResult}" xmlns:xc="clr-namespace:ExCastle.Wpf"></Window></code>

ViewModel で、DialogResult プロパティを Boolean プロパティにバインドします。

<code class="language-csharp">public class MyViewModel : INotifyPropertyChanged
{
    ...
    private bool? _dialogResult;
    public bool? DialogResult
    {
        get { return _dialogResult; }
        set
        {
            _dialogResult = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DialogResult)));
        }
    }
    ...
}</code>

DialogResult プロパティが ViewModel に設定されている場合、DialogCloser 添付プロパティは、含まれている Window オブジェクトの DialogResult を自動的に更新し、事実上フォームを閉じます。

以上がMVVM の ViewModel から WPF フォームを閉じるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。