Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menutup Borang WPF dari ViewModel dalam MVVM?

Bagaimana untuk Menutup Borang WPF dari ViewModel dalam MVVM?

Mary-Kate Olsen
Lepaskan: 2025-01-23 02:51:09
asal
287 orang telah melayarinya

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

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).

Masalah: ViewModel kekurangan pengetahuan pandangan

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.

Penyelesaian biasa

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.

Penyelesaian ringkas: Atribut tambahan DialogCloser

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan