2010-02-24 15 views
6

Scommetto che questo è stato risposto più volte, ma ...WPF - Gestire un ApplicationCommand nel ViewModel

Per una semplice situazione in cui un pulsante su un UserControl ha la proprietà di comando impostata a qualcosa di simile a Find (ApplicationCommands .Find) come il ViewModel gestirà quel comando? Di solito vedo i gestori di comandi cablati con un CommandBinding che viene aggiunto a una raccolta CommandBindings su un UIElement, ma il mio ViewModel non deriva da UIElement (vero?). I comandi stessi non espongono eventi da notificare quando sono stati eseguiti, quindi dove dovrei collegarmi per ottenere quelle informazioni?

MODIFICA: Vorrei utilizzare il WPF di serie per risolvere il problema se possibile. So che ci sono molti framework disponibili per questo genere di cose, ma vorrei mantenere il codice semplice.

EDIT2: incluso un codice di esempio.

<UserControl> 
    <UserControl.DataContext> 
    <local:MyViewModel/> 
    </UserControl.DataContext> 

    <Button Command="Find"/> 
</UserControl> 

Dove:

class MyViewModel 
{ 
    // Handle commands from the view here. 
} 

potrei aggiungere un CommandBinding al UserControl, che avrebbe gestito Eseguito, quindi chiamare un metodo Find ipotetico MyViewModel che fa il lavoro vero e proprio, ma questo è il codice in più e non necessario. Preferirei che ViewModel gestisse il comando Trova. Una possibile soluzione sarebbe quella di far derivare MyViewModel da UIElement che sembra invece contro intuitivo.

risposta

4

Lo scopo dei comandi è quello di disaccoppiare il codice che genera l'ordine dal codice che lo esegue. Quindi: se si vuole accoppiamento stretto, è meglio farlo attraverso eventi:

<UserControl ... x:Class="myclass"> 
    ... 
    <Button Click="myclass_find" .../> 
    ... 
</UserControl> 

Per accoppiamento lasco è necessario aggiungere un CommandBinding al vostro UserControl:

<UserControl ... > 
    <UserControl.DataContext> 
     <local:MyViewModel/> 
    </UserControl.DataContext> 

    <UserControl.CommandBindings> 
     <Binding Path="myFindCommandBindingInMyViewModel"/> 
    </UserControl.CommandBindings> 
    ... 
    <Button Command="ApplicationComamnd.Find" .../> 
    ... 
</UserControl> 

(non è sicuro su la sintassi)

Oppure è possibile aggiungere un CommandBinding al numero UserControl di CommandBindings nel costruttore, prendendo la val ue dal ViewNodel:

partial class MyUserControl : UserControl 
{ 
    public MyUSerControl() 
    { 
     InitializeComponent(); 
     CommandBinding findCommandBinding = 
        ((MyViewModel)this.DataContext).myFindCommandBindingInMyViewModel; 
     this.CommandBindings.Add(findCommandBinding); 
    } 
} 
+0

Preferisco l'accoppiamento libero, quindi sto cercando una risposta che mostri come gestire il comando in una classe separata da UserControl. –

+0

vuoi elaborare 'ApplicationCommands.Find' allo stesso modo per tutte le fonti? – Vlad

+0

Aggiunta del codice per chiarire dove voglio gestire l'esecuzione del comando - Mi piacerebbe gestire i comandi nel ViewModel, non nello UserControl stesso in linea con la filosofia MVVM generale. –

Problemi correlati