Dalam corak reka bentuk MVVM WPF, cabaran biasa ialah cara menutup paparan (cth., borang) daripada ViewModel. ViewModel biasanya bertanggungjawab untuk mengurus logik perniagaan, manakala pandangan bertanggungjawab untuk paparan antara muka pengguna (UI).
Dengan reka bentuk, ViewModel tidak sepatutnya mempunyai pengetahuan langsung tentang View. Ini memastikan pengasingan kebimbangan dan membenarkan kebebasan UI. Walau bagaimanapun, menutup borang memerlukan akses kepada paparan, yang boleh menjadi masalah.
Kaedah Tradisional CodeBehind: Ini melibatkan meletakkan kod untuk menutup borang dalam kod di belakang fail paparan. Ini melanggar corak MVVM dan memperkenalkan gandingan antara paparan dan ViewModel.
Sifat tambahan dengan pencetus gaya: Anda boleh menentukan sifat yang dilampirkan pada borang dan menggunakan pencetus gaya untuk menutup borang apabila sifat yang dilampirkan ditetapkan. Walaupun penyelesaian ini mematuhi prinsip MVVM, ia melibatkan kod tambahan dan boleh menyusahkan.
Anda boleh mencipta sifat tersuai yang dilampirkan dipanggil DialogCloser untuk memudahkan proses ini. Sifat ini mengambil parameter bool yang mewakili DialogResult borang. Apabila nilai harta ini ditetapkan, ia secara automatik menetapkan sifat DialogResult objek Window yang mengandungi borang.
<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>
Untuk menggunakan atribut ini, hanya gunakannya pada elemen Window dalam paparan XAML anda:
<code class="language-xml"><Window ... xc:DialogCloser.DialogResult="{Binding DialogResult}" xmlns:xc="clr-namespace:ExCastle.Wpf"></Window></code>
Dalam ViewModel, ikat sifat DialogResult kepada sifat 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>
Apabila sifat DialogResult ditetapkan dalam ViewModel, sifat DialogCloser yang dilampirkan secara automatik mengemas kini DialogResult objek Tetingkap yang mengandungi, dengan berkesan menutup borang.
Atas ialah kandungan terperinci Bagaimana untuk Menutup Borang WPF dari ViewModel dalam MVVM?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!