Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menutup Borang WPF daripada ViewModel Menggunakan Harta Terlampir dalam MVVM?

Bagaimanakah Saya Boleh Menutup Borang WPF daripada ViewModel Menggunakan Harta Terlampir dalam MVVM?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-23 02:44:11195semak imbas

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

Tutup borang WPF dalam MVVM menggunakan sifat yang dilampirkan

Dalam aplikasi MVVM, menguruskan penutupan borang boleh menjadi mencabar kerana ViewModel tidak mengetahui tentang paparan sebenar. Artikel ini meneroka penyelesaian yang elegan menggunakan sifat yang dilampirkan untuk menutup borang daripada ViewModel dengan lancar.

Dilema

Pertimbangkan borang log masuk biasa yang ViewModel memegang bukti kelayakan pengguna. Apabila menyerahkan arahan log masuk, ViewModel memulakan operasi log masuk:

  • Selepas log masuk berjaya, borang log masuk perlu ditutup dan DialogResult yang sah dikembalikan.
  • Apabila log masuk tidak sah, mesej ralat akan dipaparkan dan borang akan kekal terbuka.

Lepaskan halangan dengan atribut tambahan

Untuk menangani cabaran ini, kami boleh memanfaatkan sifat tambahan untuk merapatkan jurang antara ViewModel dan View:

<code class="language-xml"><Window ... DialogResult="{Binding DialogResult, Source={StaticResource ViewModel}}"
       xmlns:xc="clr-namespace:ExCastle.Wpf">
</Window></code>

Harta ini mengikat sifat DialogResult ViewModel kepada sifat DialogResult tetingkap. Apabila ViewModel mengubah suai DialogResult, sifat yang dilampirkan secara automatik mengemas kini DialogResult tetingkap dan menutup borang dengan sewajarnya.

Pelaksanaan kod

Berikut ialah kod untuk atribut yang dilampirkan:

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

Dalam ViewModel, cuma laksanakan INotifyPropertyChanged dan kemas kini sifat DialogResult apabila log masuk berjaya:

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

Kesederhanaan dan Kesucian

Pendekatan ini menyelesaikan masalah penutupan borang secara elegan tanpa menjejaskan prinsip MVVM. ViewModel kekal dipisahkan daripada paparan sambil mengawal penutupan borang secara berkesan melalui pengikatan harta mudah.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menutup Borang WPF daripada ViewModel Menggunakan Harta Terlampir dalam MVVM?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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