2011-10-05 17 views
15

Suponiendo un código como el de abajo,¿Cómo crear comandos enlazables en el control personalizado?

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 ?? 

En mi SomeCustomControl, tengo que apoyar "unión de ICommand en XAML". Entiendo que DependencyProperties podría vincularse así, pero en este caso necesito unir ICommand.

¿Puede alguien sugerir cuál es la mejor manera de hacerlo? Cualquier material o enlace sugerido sería útil porque me falta una dirección.

EDITAR 1) Puedo usar el DataContext SomeView en SomeCustomControl. Hay más lógica y separación entre los dos que no puedo disolver. Debo mantener una referencia de Reload/Save ICommands en algún lugar de SomeCustomControl.

Muchas gracias.

Respuesta

31

Déjeme ponerlo en línea recta, ¿desea vincularse al Reload y Save derecho?

Así que hay que crear, declarar y definir dos propiedades de dependencia ReloadCommandProperty y SaveCommandProperty de tipo ICommand para SomeCustomControl.

Así que asumiendo que se deriva de SomeCustomControlControl ...

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); 
     } 
    } 
} 

Después de esta unión adecuada a RelodCommand y SaveCommand propiedades empezará a trabajar ...

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

Crea una propiedad que devolverá tu comando y unirá esta propiedad donde sea necesario.

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

cambiar el enlace en el código para

<Button Command={Binding ReloadCommand}" /> 

y se unen los DataContext de control personalizados para el modelo de vista que contiene los comandos.

+0

¿Quieres decir que puedo enlazar directamente una Instancia ICommand a una propiedad en un control? Además, ¿para qué sirve "CreateReloadCommand"? Esta instancia de comando se creará en ViewModel, y SomeCustomControl solo necesita almacenar esa referencia de instancia (usando el enlace xaml). –

+0

Puede vincular el valor del tipo ICommand a lo que desee, la propiedad de dependencia más significativa para el enlace es 'ButtonBase.CommandProperty'. 'CreateReloadCommand' es un método que crea su comando; no quise escribir el código de inicialización y creación del comando. Cuando estaba escribiendo mi respuesta, tiene métodos para comandos en su código (los ha cambiado más adelante). –

Cuestiones relacionadas