SORU
2 ŞUBAT 2009, PAZARTESİ


Nasıl ViewModel formu kapatmak gerekir?

WPF ve MVVM sorunu öğrenmeye çalışıyorum, ama bir engele takıldı. Bu soruya benzer ama 9 **... eskisi gibi değil

"Form MVVM desen kullanarak yazılmış. "Giriş var

Bu form XAML normal veri bağlantıları kullanarak görünümü bağlı olan Kullanıcı adı ve Parola tutan bir ViewModel vardır. Ayrıca "" "" düğmesinin formda, normal veri bağlama kullanarak ağan. Giriş bağlı olan komut Giriş var

Ne zaman "" komut patlar, patlarsa ve ağ üzerinden veri giriş yapmak için gönderir. ViewModel bir işlevi çağırır Giriş Bu işlevi tamamlandığında, 2 eylem vardır:

  1. Oturum açma geçersiz oldu - biz sadece bir MessageBox göstermek ve tüm iyi

  2. Oturum açma geçerli olduğunu, 2 *...* olarak Giriş formu kapatın ve geri doğru yapmamız gerekiyor

Sorun ViewModel gerçek görünümü, görünümü nasıl kapatıp söyle belirli bir DialogResult dönmek için olabilir mi? yani hakkında hiçbir şey bilmiyor. CodeBehind ve/bazı kod sopa veya Görünümü ile ViewModel için geçerim, ama bu MVVM bütün mesele tamamen saptırır gibi görünüyor...


Güncelleme

Sonunda sadece "saflık" MVVM deseni ve Görünümü Closed bir olay yayınlamak ve Close yöntemi kullanır oldu. bu ihlal Bu ViewModel sonra sadece view.Close der. Görünümü tek bir arabirim üzerinden bilinen ve IOC konteynerine üzerinden kablolu, test edilebilirlik veya idame kaybolur.

Kabul cevabı -5 oy olduğunu aptal görünüyor! Süre farkındayım bu güzel duygular öyle bir rahatlatıyor çözme bir sorun olurken "saf", Kesinlikle değilim tek kişi olduğunu düşünen 200 satır olaylar, komutlar ve davranışlar sadece önlemek için bir tek satır yöntemi adı "desen" ve "saflık" biraz saçma....

CEVAP
25 Temmuz 2010, Pazar


Thejuan's answer basit bağlı bir özellik yazmak için ilham kaynağı oldu. Hayır stilleri, hayır; bunun yerine, sadece bunu yapabilirsiniz tetikler

<Window ...
        xmlns:xc="clr-namespace:ExCastle.Wpf"
        xc:DialogCloser.DialogResult="{Binding DialogResult}">

Bu WPF takım haksız ve ilk etapta bağımlılık özelliği DialogResult yapılmış olsaydı kadar temiz. Sadece ViewModel bool? DialogResult bir özellik koymak ve INotifyPropertyChanged uygulamak, ve İşte, sizin ViewModel Pencere (ve DialogResult set) sadece bir özelliğini ayarlayarak kapatabilirsiniz. Olması gerektiği gibi MVVM.

İşte DialogCloser kodu:

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);
        }
    }
}

Ayrıca on my blog Bu ilan ettik.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bmarian22

    bmarian22

    22 Aralık 2007
  • OVERWERK

    OVERWERK

    6 Temmuz 2010
  • psidot

    psidot

    2 Kasım 2006