2010-12-09 8 views
5

Tengo el botón en la primera columna en la cuadrícula de datos. Estoy usando MVVM e intento vincular Command to Command en ViewModel, pero cuando hago clic en el botón de cada fila, no funciona (no llama a Comando en ViewModel) pero si lo muevo de la cuadrícula de datos, funciona correctamente.Cómo activar el evento desde el botón dentro de la cuadrícula de datos en Silverlight y MVVM

¿Cómo puedo disparar el evento desde el botón dentro de la cuadrícula de datos en MVVM?

Actualización 1:

código XAML es:

<datagrid:DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" 
         VerticalAlignment="Center"> 
      <Button x:Name="button" Content="View" Margin="5" DataContext="{StaticResource XDataContext}"> 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="Click"> 
         <i:InvokeCommandAction Command="{Binding ViewOrganizationCommand}" 
               CommandParameter="{Binding ElementName=dtgOrganizations, Path=SelectedItem}" /> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </Button> 
     </StackPanel> 
    </DataTemplate> 
</datagrid:DataGridTemplateColumn.CellTemplate> 

código del modelo de vista es:

public ViewModelCommand ViewOrganizationCommand { get; set; } 
+0

Ver su código xaml y VM será útil. Por favor agrégalo. –

+0

Código fuente agregado como sugiere :) – Anonymous

+1

¿Recibió alguna excepción de enlace? Puedes verlo en la ventana de Salida. – thomasmartinsen

Respuesta

1

En lugar de utilizar EventTrigger, ¿por qué no simplemente unirse a Button .Command directamente, como tal?

<Button 
    ...other properties... 
    Command="{Binding ViewOrganizationsCommand}" 
    CommandParameter="{Binding}"/> 

que se unirá el comando, y establecer el CommandParameter a la DataContext del botón, que presumiblemente es una buena cosa para enlazar el parámetro a. Si no es así, simplemente vincule CommandParameter a otra cosa que lo ayude a identificar de manera única la fila específica en la que se hace clic.

0

La unión mediante el disparador de eventos se ve bien de comandos (Así es como siempre lo hago), Pero sospecho que su mando nunca se asigna a (Está utilizando Propiedades automáticas) por lo general lo hago de esta manera:

private ViewModelCommand viewOrganizationCommand; 

public ViewModelCommand ViewOrganizationCommand 
     { 
     get 
     { 
      if (viewOrganizationCommand == null) 
       viewOrganizationCommand = new ViewModelCommand(Action, CanDoIt); 
      return viewOrganizationCommand; 
     } 
     } 
0

intente configurar Button's DataContext en el StackPanel y configure el Command y CommandParameter del botón.

<datagrid:DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" 
         VerticalAlignment="Center" DataContext="{StaticResource XDataContext}"> 
      <Button x:Name="button" Content="View" Margin="5" Command="{Binding ViewOrganizationCommand}" CommandParameter="{Binding ElementName=dtgOrganizations, Path=SelectedItem}" > 
      </Button> 
     </StackPanel> 
    </DataTemplate> 
</datagrid:DataGridTemplateColumn.CellTemplate> 
0

Cada fila del DataGrid tiene su DataContext configurado para ese objeto. Si el ItemSource para la grilla es una ObservableCollection, el DataContext de cada fila es el objeto de organización.

Hay dos maneras de manejar esto.

  1. Cree una envoltura o extensión ViewModel que expone el comando. Entonces el comando debería disparar. Aquí hay un código psuedo.

    public class OrganizationExtensionViewModel 
    { 
        <summary> 
        /// Private currentOrginization property. 
        /// </summary>   
        private Organization currentOrginization; 
    
        public Organization CurrentOrganization 
        { 
         get 
         { 
          return this.currentOrginization; 
         } 
    
         set 
         { 
          if (this.currentOrginization != value) 
          { 
           this.currentOrginization = value; 
           this.RaisePropertyChanged("CurrentOrganization"); 
          } 
         } 
        } 
    
        public ViewModelCommand ViewOrganizationCommand { get; set; } 
        public OrganizationExtensionViewModel(Organization o) 
        { 
         this.CurrentOrganization = o; 
         this.ViewOrganizationCommand = new ViewModelCommand(this.ViewOrgnaizationClicked); 
        } 
    } 
    
  2. Definir el modelo de vista en el xaml como StaticResource y se refieren a ella como la ruta de enlace.

... En la cuadrícula

<Button x:Name="button" Content="View" Margin="5" Command="{Binding ViewOrganizationCommand, Source={StaticResource viewModel}}" /> 
1

This article trae la solución con DataContextProxy. La aplicación de esta solución hace posible escribir un código de botón como la respuesta de Austin Lamb.

Cuestiones relacionadas