2009-08-21 2 views
1

Also hier ist mein Dilemma, ich möchte Ansichtsereignisse auf meinem View-Modell behandeln, Problem ist, um einen Event-Handler hinzuzufügen, muss meine Ansicht einen Code hinter der Datei haben und daher muss ein Klassenattribut gesetzt werden. Ich bin mir zu 99% sicher, dass das eine schlechte Idee ist, und um ganz ehrlich zu sein, ich bin nicht einmal sicher, wie ich es machen soll (außer dem offensichtlichen x: Class = "" Teil) eine MVVM-Anwendung?Was ist der "richtige" Weg in WPF MVVM, ein FrameworkElement-Ereignis an einen Viewmodel-Handler zu binden?

<ResourceDictionary> 
    <DataTemplate DataType="{x:Type vm:OutletViewModel}"> 
     <Button Click="IHaveNoBinding"> 
    </DataTemplate> 
</ResourceDictionary> 

Antwort

4

Verwendung commands:

<Button Command="{Binding ACommandOnYourViewModel}"/> 

Siehe this post von mir für einen nützlichen Befehl Implementierung Sie in Ihrer Ansicht Modelle verwenden können.

Angenommen, Sie können keine Befehle verwenden, verwenden Sie attached command behaviors.

+0

Okay, gehe ich davon keine Befehle verwenden können, Angenommen, es ist Textbox.TextChanged – Firoso

+0

Edited entsprechend. –

+0

Für Text verwenden Sie Bindung: decasteljau

2

Ich verwende Attached Behaviors. Angehängte Verhaltensweisen übersetzen im Grunde Ereignisse in Befehle. Schauen Sie sich diesen Link für ein Beispiel:

http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx

Hier ist der Code für eine TextChangedBehavior ist.

public static class TextChangedBehavior 
    { 
    public static readonly DependencyProperty TextChangedCommandProperty = 
     DependencyProperty.RegisterAttached("TextChangedCommand", 
              typeof(ICommand), 
              typeof(TextChangedBehavior), 
              new PropertyMetadata(null, TextChangedCommandChanged)); 

    public static ICommand GetTextChangedCommand(DependencyObject obj) 
    { 
     return (ICommand)obj.GetValue(TextChangedCommandProperty); 
    } 

    public static void SetTextChangedCommand(DependencyObject obj, ICommand value) 
    { 
     obj.SetValue(TextChangedCommandProperty, value); 
    } 

    private static void TextChangedCommandChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     TextBoxBase textBox = obj as TextBoxBase; 

     if (textBox != null) 
     { 
     textBox.TextChanged += new TextChangedEventHandler(HandleTextChanged); 
     } 
    } 

    private static void HandleTextChanged(object sender, TextChangedEventArgs e) 
    { 
     TextBox textBox = sender as TextBox; 
     if (textBox != null) 
     { 
     ICommand command = GetTextChangedCommand(textBox); 
     command.Execute(textBox.Text); 
     } 
    } 
    } 

XAML:

<TextBox behavior:TextChangedBehavior.TextChangedCommand="{Binding TextChangedCommand}" /> 
1

Im Allgemeinen werde ich nicht das beigefügte Verhaltensmuster für einfache Dinge wie diese verwendet werden. Als Berater finde ich es komplizierter für neuere Entwickler.

Wie also behandeln Sie die Interaktion mit der Steuerung, wenn keine Befehle verfügbar sind? Mach dich bereit, dich selbst vom Boden aufzumachen :-) Ich werde oft den Code dafür benutzen. Der Ereignishandler im Code dahinter behandelt das Ereignis, sammelt alle erforderlichen Daten aus den Ereignisargumenten und leitet die Anforderung dann an das View-Modell weiter. Sie verlieren dadurch nicht viel, da die meisten Dinge, die ICommand nicht unterstützen, das hide/show/enable/disable trotzdem nicht nutzen können.

Es gibt jedoch einige Regeln. Der dahinter stehende Code kann nur für die Steuerweiterleitung an das Ansichtsmodell verwendet werden. Solange Sie Ereignisargumente nicht direkt an das Ansichtsmodell übergeben, ist es in Ordnung, Ereignisse auf diese Weise zu verwenden. Die Tatsache dieser Angelegenheit ist in großen Anwendungen, die Sie Code-Hintern nicht immer weg haben können. Wenn Sie sie so verwenden, wie sie beabsichtigt waren, also Seitenkontrollen, sehe ich keinen Schaden.

0

Code hinter ist überhaupt keine schlechte Sache. Es gibt genügend Szenarien, in denen Sie keine WPF-Datenbindung (z. B. PasswordBox) verwenden können und dann einen Code hinter der Datei erstellen müssen.

Wie Sie eine PasswordBox verwenden können, ohne Bindung im Ansichtsmodell Beispiel für dieses Projekt gezeigt wird:

WPF Application Framework (WAF)

http://waf.codeplex.com

Verwandte Themen