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:
Oturum açma geçersiz oldu - biz sadece bir MessageBox göstermek ve tüm iyi
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
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.
Nasıl daha sonra düz metin alma için e...
Dosya kullanır .md uzantısı ve bunları...
Nasıl geri tuşu ile UİTextView için kl...
Alan salt okunur yapmak için Nasıl dja...
Nasıl word HTML kaydırma kapatmak için...