2010-08-04 14 views
11

geladen wird, ist es möglich, einen Befehl zu feuern das Fenster zu benachrichtigen, wird geladen. Auch ich verwende keine MVVM Frameworks (Frameworks im Sinne Caliburn, Onxy, MVVM Toolkit usw.)wie ein Befehl ausgelöst, wenn ein Fenster in wpf

+6

Fast alle Ereignisse nicht abfeuern kann ein Befehl im ViewModel. Sie können nur die Tatsache akzeptieren und 1 Zeile Code in der Codebehind schreiben oder etwas obskures Muster, dass nach mehreren komplizierten Codezeilen das Gleiche tun implementieren. #dontbeapurist –

+0

ich mit @EduardoMolteni nicht einverstanden sind. Wenn das Ereignis mit der Arbeit mit Daten zusammenhängt, müssen Sie mit der VM bei Code hinterher arbeiten, was sich leicht vermeiden lässt, wenn Sie Verhalten in WPF verwenden. – JoanComasFdz

Antwort

18

Um Code hinter Ihrer Ansicht zu vermeiden , verwenden Sie die Interactivity-Bibliothek (System.Windows.Interactivity dll, die Sie kostenlos von Microsoft herunterladen können - kommt auch mit Expression Blend).

Dann können Sie ein Verhalten erstellen, die einen Befehl ausführt. Auf diese Weise ruft der Auslöser das Verhalten auf, das den Befehl aufruft.

<ia:Interaction.Triggers> 
    <ia:EventTrigger EventName="Loaded"> 
     <custombehaviors:CommandAction Command="{Binding ShowMessage}" Parameter="I am loaded"/> 
    </ia:EventTrigger> 
</ia:Interaction.Triggers> 

Command (auch verwendet System.Windows.Interactivity) aussehen kann:

public class CommandAction : TriggerAction<UIElement> 
{ 
    public static DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandAction), null); 
    public ICommand Command 
    { 
     get 
     { 
      return (ICommand)GetValue(CommandProperty); 
     } 
     set 
     { 
      SetValue(CommandProperty, value); 
     } 
    } 


    public static DependencyProperty ParameterProperty = DependencyProperty.Register("Parameter", typeof(object), typeof(CommandAction), null); 
    public object Parameter 
    { 
     get 
     { 
      return GetValue(ParameterProperty); 
     } 
     set 
     { 
      SetValue(ParameterProperty, value); 

     } 
    } 

    protected override void Invoke(object parameter) 
    { 
     Command.Execute(Parameter);    
    } 
} 
+0

Ich habe gerade festgestellt, dass dieser Code für Silverlight ist. Wenn Sie den entsprechenden Trigger/Verhalten in WPF finden können, würde ich denken, dass die gleichen Prinzipale funktionieren sollten. – programatique

+1

Statt Command scheint es dafür jetzt eine vorhandene Aktion zu sein, [InvokeCommandAction] (http://msdn.microsoft.com/en-us/library/system.windows.interactivity.invokecommandaction (Expression.40) aspx) – Patrick

7
private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     ApplicationCommands.New.Execute(null, targetElement); 
     // or this.CommandBindings[0].Command.Execute(null); 
    } 

und XAML

Loaded="Window_Loaded" 
+2

Ich habe vergessen zu erwähnen, dass ich MVVM verwende. Wann wird ein Fenster geladen? Es sollte einen Befehl auslösen, den ich in meiner ViewModel-Klasse hören kann. –

+22

MVVM ist keine Religion. Sie können eine Codezeile im CodeBehind hinzufügen und die Welt wird sich immer noch drehen. –

+0

Sind Sie sicher! Bist du sicher, dass es weiter drehen wird? :) – GONeale

2

Eine generische Art und Weise Verhalten verwendet, wird bei AttachedCommandBehavior V2 aka ACB vorgeschlagen und unterstützt sogar mehrere Event-to-Befehlsbindungen,

Hier ist ein sehr einfaches Beispiel für die Verwendung:

<Window x:Class="Example.YourWindow" 
     xmlns:local="clr-namespace:AttachedCommandBehavior;assembly=AttachedCommandBehavior" 
     local:CommandBehavior.Event="Loaded" 
     local:CommandBehavior.Command="{Binding DoSomethingWhenWindowIsLoaded}" 
     local:CommandBehavior.CommandParameter="Some information" 
/> 
Verwandte Themen