2011-10-05 11 views
15

Assumendo un codice come qui di seguito,Come creare comandi associabili nel controllo personalizzato?

public class SomeViewModel{ 
     ICommand ReloadCommand{get...} 
     ICommand SaveCommand{get..} 
} 

//SomeView.xaml 
<SomeCustomControl Reload="ReloadCommand" Save="SaveCommand" /> //NOT SURE HOW?? 

//SomeCustomContro.xaml 
<SomeCustomControl x:Name="someCustomControl"> 
<Button Command={Binding ElementName=someCustomControl, Path=Reload /> 
<Button Command={Binding ElementName=someCustomControl, Path=Save /> 
</SomeCustomControl> 

//SomeCustomControl.xaml.cs 
..... //NOT SURE HOW TO ALLOW BINDING TO A ICOMMAND ?? 

Nel mio SomeCustomControl, ho bisogno di sostenere "legame di ICommand in XAML". Capisco che DependencyProperties potrebbe essere vincolante in questo modo, ma in questo caso devo associare ICommand.

Qualcuno può suggerire qual è il modo migliore per farlo? Qualsiasi materiale o collegamento suggerito sarebbe utile perché mi manca una direzione.

EDIT 1) posso usare il DataContext SomeView in SomeCustomControl. C'è più logica e separazione tra i due che non posso sciogliere. Devo 'mantenere un riferimento di Ricarica/Salva ICommands da qualche parte nel mio SomeCustomControl.

Grazie mille.

risposta

31

Lasciami fare, vuoi legare allo Reload e Save giusto?

Così che ha bisogno di creare, dichiarando e definendo due proprietà di dipendenza ReloadCommandProperty e SaveCommandProperty di tipo ICommand per SomeCustomControl.

Quindi, supponendo che SomeCustomControl deriva da Control ...

public class SomeCustomControl : Control 
{ 
    public static DependencyProperty ReloadCommandProperty 
     = DependencyProperty.Register(
      "ReloadCommand", 
      typeof (ICommand), 
      typeof (SomeCustomControl)); 

    public static DependencyProperty SaveCommandProperty 
     = DependencyProperty.Register(
      "SaveCommand", 
      typeof(ICommand), 
      typeof(SomeCustomControl)); 

    public ICommand ReloadCommand 
    { 
     get 
     { 
      return (ICommand)GetValue(ReloadCommandProperty); 
     } 

     set 
     { 
      SetValue(ReloadCommandProperty, value); 
     } 
    } 

    public ICommand SaveCommand 
    { 
     get 
     { 
      return (ICommand)GetValue(SaveCommandProperty); 
     } 

     set 
     { 
      SetValue(SaveCommandProperty, value); 
     } 
    } 
} 

Dopo questo adeguato vincolante per RelodCommand e SaveCommand proprietà inizierà a lavorare ...

 <SomeCustomControl RelodCommand="{Binding ViewModelReloadCommand}" 
         SaveCommand="{Binding ViewModelSaveCommand}" /> 
2

Creare una proprietà che restituirà il comando e associare questa proprietà ovunque sia necessario.

private ICommand _reloadCommand; 
public ICommand ReloadCommand 
{ 
    get 
    { 
    if(_reloadCommand == null) _reloadCommand = CreateReloadCommand(); 
    return _reloadCommand; 
    } 
} 

Modifica il legame nel codice per

<Button Command={Binding ReloadCommand}" /> 

e legare il DataContext controllo personalizzato a vista il modello che contiene i comandi.

+0

Vuoi dire che posso associare direttamente un ICommand istanza di una proprietà in un controllo ?? Inoltre, per cosa è "CreateReloadCommand"? Questa istanza di comando verrà creata in ViewModel e SomeCustomControl deve solo memorizzare quel riferimento di istanza (usando l'associazione xaml). –

+0

È possibile associare il valore del tipo ICommand a qualsiasi cosa si desideri, la proprietà di dipendenza più significativa per l'associazione è 'ButtonBase.CommandProperty'. 'CreateReloadCommand' è un metodo che crea il tuo comando - Non volevo scrivere il codice di creazione e inizializzazione del comando. Quando stavo scrivendo la mia risposta, hai metodi per i comandi nel tuo codice (li hai cambiati in seguito). –

Problemi correlati