ホームページ > バックエンド開発 > C++ > MVVM で添付プロパティを使用して ViewModel から WPF フォームを閉じるにはどうすればよいですか?

MVVM で添付プロパティを使用して ViewModel から WPF フォームを閉じるにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-23 02:44:11
オリジナル
228 人が閲覧しました

How Can I Close a WPF Form from the ViewModel Using an Attached Property in MVVM?

添付プロパティを使用して MVVM で WPF フォームを閉じる

MVVM アプリケーションでは、ViewModel が実際のビューについて認識していないため、フォームを閉じるの管理が困難になる場合があります。この記事では、添付プロパティを使用して ViewModel からフォームをシームレスに閉じるエレガントなソリューションについて説明します。

ジレンマ

ViewModel がユーザー資格情報を保持する一般的なログイン フォームを考えてみましょう。ログイン コマンドを送信すると、ViewModel はログイン操作を開始します:

  • ログインに成功したら、ログイン フォームを閉じて、有効な DialogResult を返す必要があります。
  • ログインが無効な場合、エラー メッセージが表示され、フォームは開いたままになります。

追加の属性でバリアを破る

この課題に対処するには、追加のプロパティを利用して ViewModel と View の間のギャップを埋めることができます。

<code class="language-xml"><Window ... DialogResult="{Binding DialogResult, Source={StaticResource ViewModel}}"
       xmlns:xc="clr-namespace:ExCastle.Wpf">
</Window></code>
ログイン後にコピー

このプロパティは、ViewModel の DialogResult プロパティをウィンドウの DialogResult プロパティにバインドします。 ViewModel が DialogResult を変更すると、添付プロパティによってウィンドウの DialogResult が自動的に更新され、それに応じてフォームが閉じられます。

コードの実装

添付された属性のコードは次のとおりです:

<code class="language-csharp">using System.Windows;

namespace ExCastle.Wpf
{
    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>
ログイン後にコピー

ViewModel で、INotifyPropertyChanged を実装し、ログインが成功したときに DialogResult プロパティを更新するだけです。

<code class="language-csharp">private bool? _dialogResult;
public bool? DialogResult
{
    get { return _dialogResult; }
    set
    {
        _dialogResult = value;
        OnPropertyChanged(nameof(DialogResult));
    }
}

// 登录命令逻辑
public ICommand LoginCommand { get; set; }</code>
ログイン後にコピー

シンプルさと純粋さ

このアプローチは、MVVM の原則に影響を与えることなく、フォームを閉じる問題をエレガントに解決します。 ViewModel はビューから切り離されたままですが、単純なプロパティ バインディングを通じてフォームを閉じることを効果的に制御します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート