MVVM アプリケーションでは、ViewModel が実際のビューについて認識していないため、フォームを閉じるの管理が困難になる場合があります。この記事では、添付プロパティを使用して ViewModel からフォームをシームレスに閉じるエレガントなソリューションについて説明します。
ViewModel がユーザー資格情報を保持する一般的なログイン フォームを考えてみましょう。ログイン コマンドを送信すると、ViewModel はログイン操作を開始します:
この課題に対処するには、追加のプロパティを利用して 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 サイトの他の関連記事を参照してください。