none
Wie Commands vom ViewModel aus einer View aufrufen... RRS feed

  • Frage

  • Hallo,

    habe 2 Commands mit einem Parameter im ViewModel, die bei Eintreten eines Events in der View aufgerufen werden sollen. Der DataContext ist gesetzt. Weiss allerdings nicht, wie man das Binding herstellt (gerne auch über die XAML) bzw. wie man das Viewseitig Implementiert. Kann mir das einer an einem Beispiel zeigen?

    Ein Button hat z.B. ein Command Interface. Wenn ich beim Drücken im Model das mitkriegen will, würde man in der XAML

    <Button Command={Binding ButtonExecuted} .... schreiben, wobei ButtonExecuted im Model implementiert ist.

    Jetzt habe ich ein UserControl und würde das gerne ähnlich haben. Z.B. so:

    <MyUserControl Command1={Binding Command1Execute} CommandParameter1=? Command2={Binding Command2Execute} CommandParameter2=? ...

    Wie lege ich die 2 Command Schnittstellen in MyUserControlView an, wie erfolgt der Aufruf (ein Datum muss mitgegeben werden) und kann man die dann wie beim Button in der XAML binden bzw. wie geht es per Code Behind?

    Gruß

    Diana








    Freitag, 26. August 2011 09:01

Antworten

  • Mit den Extensions zu den Interaction Triggers habe ich vor 2-3 Monaten schon experimentiert. Man müsste aber die Extensions dazu binden und man weiss  ja nicht inwieweit die in der Wartung sind. Ist halt nicht standard.

    Hab aber jetzt eine andere eher klassische Lösung gefunden:

    In der View des MyUserControls

    public static readonly DependencyProperty Command1CommandProperty = DependencyProperty.Register( "Command1Command", 
    typeof(ICommand),
    typeof(MyUserControlView));
    public ICommand Command1Command 
    {
    get { return (ICommand)this.GetValue(Command1CommandProperty); }
    set { this.SetValue(Command1CommandProperty, value); }
    }
    private void Event(int data) 
    {
    if (this.Command1Command != null)
    {
    this.Command1Command.Execute(data);
    }
    }

     

    In der XAML:

    <UserControls:MyUserControlView Command1Command={Binding Command1Execute} ...
    
    

    Der CommandParameter wird nicht benötigt.

    Im Model:

    private RelayCommand command1Execute;
    
    
    Im Construktor des Models:
    this.command1Execute = new RelayCommand(this.OnCommand1Execute);

    public RelayCommand Command1Execute 
    {
    get { return this.command1Execute; }
    }
    private void OnCommand1Execute(object param) 
    {
    int data= (int) param;

    // tuhe was Du willst mit data...
    }

    Der Volltsändigkeit halber aufgeführt, dann kann ich selber mal nach diesem Pattern schauen, wenn ich es vergesse ;-). Eine Implementierung von RelayCommand findet man im Netz, die lasse ich hier weg. Mit dem zweiten Command verfehrt man analog.


    Freitag, 26. August 2011 11:17

Alle Antworten

  • Hallo Diana,

     

    Du könntest versuchen aus der AssetBox bei Blend eine InvokeComamndAction auf dein UserControl zu legen und auf dem entsprechendem Event (Loaded/Initialize) die Commands ausführen und Parameter übergeben.

    <UserControl...>

     <i:Interaction.Triggers>

     <i:EventTrigger EventName="Loaded">

     <i:InvokeCommandAction  Command="{Binding Command1Execute} CommandParameter=.../>

     <i:InvokeCommandAction  Command="{Binding Command2Execute} CommandParameter=.../>

    </i:EventTrigger>

    </i:Interaction.Triggers>

    </UserControl>

    Grüße

     

    JP




    Freitag, 26. August 2011 10:21
  • Mit den Extensions zu den Interaction Triggers habe ich vor 2-3 Monaten schon experimentiert. Man müsste aber die Extensions dazu binden und man weiss  ja nicht inwieweit die in der Wartung sind. Ist halt nicht standard.

    Hab aber jetzt eine andere eher klassische Lösung gefunden:

    In der View des MyUserControls

    public static readonly DependencyProperty Command1CommandProperty = DependencyProperty.Register( "Command1Command", 
    typeof(ICommand),
    typeof(MyUserControlView));
    public ICommand Command1Command 
    {
    get { return (ICommand)this.GetValue(Command1CommandProperty); }
    set { this.SetValue(Command1CommandProperty, value); }
    }
    private void Event(int data) 
    {
    if (this.Command1Command != null)
    {
    this.Command1Command.Execute(data);
    }
    }

     

    In der XAML:

    <UserControls:MyUserControlView Command1Command={Binding Command1Execute} ...
    
    

    Der CommandParameter wird nicht benötigt.

    Im Model:

    private RelayCommand command1Execute;
    
    
    Im Construktor des Models:
    this.command1Execute = new RelayCommand(this.OnCommand1Execute);

    public RelayCommand Command1Execute 
    {
    get { return this.command1Execute; }
    }
    private void OnCommand1Execute(object param) 
    {
    int data= (int) param;

    // tuhe was Du willst mit data...
    }

    Der Volltsändigkeit halber aufgeführt, dann kann ich selber mal nach diesem Pattern schauen, wenn ich es vergesse ;-). Eine Implementierung von RelayCommand findet man im Netz, die lasse ich hier weg. Mit dem zweiten Command verfehrt man analog.


    Freitag, 26. August 2011 11:17