WPF の MVVM 設計パターンでの共通の課題は、ViewModel からビュー (フォームなど) をどのように閉じるかです。通常、ViewModel はビジネス ロジックの管理を担当し、ビューはユーザー インターフェイス (UI) の表示を担当します。
仕様上、ViewModel は View を直接認識すべきではありません。これにより、懸念事項が確実に分離され、UI の独立性が確保されます。ただし、フォームを閉じるにはビューにアクセスする必要があるため、問題が発生する可能性があります。
従来の分離コード方式: これには、フォームを閉じるためのコードをビューの分離コード ファイルに配置することが含まれます。これは MVVM パターンに違反し、ビューと ViewModel の間に結合が生じます。
スタイルトリガーを備えた追加のプロパティ: フォームに添付プロパティを定義し、添付プロパティが設定されたときにスタイル トリガーを使用してフォームを閉じることができます。このソリューションは MVVM の原則に準拠していますが、追加のコードが必要となり、煩雑になる可能性があります。
このプロセスを簡素化するために、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 サイトの他の関連記事を参照してください。