2012-09-14 21 views
36

Tengo una vista AttributeView que contiene todo tipo de atributos. También hay un botón que cuando se presiona, debe establecer los valores predeterminados para los atributos. También tengo una clase ViewModelBase que es una clase base para todos los ViewModels que tengo. El problema es que parece que no puedo obtener el botón vinculado al comando con WPF.¿Cómo vincular el botón WPF a un comando en ViewModelBase?

He intentado esto, pero simplemente no hace nada:

<Button Command="{Binding DataInitialization}" Content="{x:Static localProperties:Resources.BtnReinitializeData}"></Button> 

se define el comando (en el ViewModelBase) así:

public CommandBase DataInitialization { get; protected set; } 

y en una aplicación de inicio nueva instancia se crea para el comando:

DataInitialization = new DataInitializationCommand() 

Sin embargo, el enlace WPF no parece "encontrar" t El comando (presionando el botón no hace nada). El ViewModel utilizado en la vista actual se deriva del ViewModelBase. ¿Qué más puedo probar (soy bastante nuevo en WPF, así que esta podría ser una pregunta muy simple)?

+0

¿CommandBase hereda de ICommand? ¿ButtonCon DataContext contiene el comando DataInitialization? ¿Tiene algún mensaje en el panel de salida sobre el enlace? –

+0

Sí, hereda ICommand. ¿Cómo verifico el DataContext del botón? No estoy seguro de los mensajes en la salida (¿debería haber alguno por defecto?). –

+0

sería más fácil si muestra más código sobre el modelo de vista y el xaml –

Respuesta

88
<Grid > 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Button Command="{Binding ClickCommand}" Width="100" Height="100" Content="wefwfwef"/> 
</Grid> 

el código detrás de la ventana:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModelBase(); 
    } 
} 

Y el modelo de vista:

public class ViewModelBase 
{ 
    public ViewModelBase() 
    { 
     _canExecute = true; 
    } 
    private ICommand _clickCommand; 
    public ICommand ClickCommand 
    { 
     get 
     { 
      return _clickCommand ?? (_clickCommand = new CommandHandler(() => MyAction(), _canExecute)); 
     } 
    } 
    private bool _canExecute; 
    public void MyAction() 
    { 

    } 
} 
public class CommandHandler : ICommand 
{ 
    private Action _action; 
    private bool _canExecute; 
    public CommandHandler(Action action, bool canExecute) 
    { 
     _action = action; 
     _canExecute = canExecute; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return _canExecute; 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     _action(); 
    } 
} 

espero que esto le dará la idea.

+0

Esto me dio una pista de dónde buscar. Resultó que el comando se inicializó en varios lugares y uno de estos lugares (el correcto) se ha comentado :) ¡Gracias! –

+0

@kor_: Es por eso que pedimos más código –

+6

Sí, esta es la mejor explicación que encontré después de muchas búsquedas. Gracias @Ethicallogics –

Cuestiones relacionadas