2011-09-28 18 views
13

Tengo View (XAML incluido) adjunto a mi ViewModel con comandos. Necesito invocar el comando cuando se hace clic en el botón en la fila de DataGrid. Estoy usando comportamientos para esto (los comandantes regulares tienen el mismo problema). Cuando hago clic en el botón en DataGrid, mi comando no se activa.Comando de enlace dentro de DataGridTemplateColumn

Para ilustrar el problema, puse ListBox en una parte inferior con las mismas cosas de encuadernación EXACTAS, y sí, el comando funciona. Por lo tanto, es algo con DataGrid/DataGridTemplateColumn

<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding}"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="30" /> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <StackPanel Orientation="Horizontal"> 
       <Button Content="Cancel" > 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="Click"> 
          <ei:CallMethodAction MethodName="Cancel" TargetObject="{Binding}"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </Button> 
      </StackPanel> 
      <sdk:DataGrid AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding Data}" Grid.Row="1"> 
       <sdk:DataGrid.Columns> 
        <sdk:DataGridTemplateColumn CanUserReorder="True" CanUserResize="True" CanUserSort="True" Width="Auto"> 
         <sdk:DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <Button Content="Select"> 
            <i:Interaction.Triggers> 
             <i:EventTrigger EventName="Click"> 
              <i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" /> 
             </i:EventTrigger> 
            </i:Interaction.Triggers> 
           </Button> 
          </DataTemplate> 
         </sdk:DataGridTemplateColumn.CellTemplate> 
        </sdk:DataGridTemplateColumn> 
        <sdk:DataGridTextColumn Binding="{Binding DeviceId}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Device" Width="Auto" FontWeight="Bold" /> 
        <sdk:DataGridTextColumn Binding="{Binding SerialNumber}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Serial Number" Width="Auto" /> 
        <sdk:DataGridTextColumn Binding="{Binding LastActivityOn}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Last Activity" Width="Auto" /> 
        <sdk:DataGridTextColumn Binding="{Binding ClientVersion}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Client Version" Width="Auto" /> 
        <sdk:DataGridTextColumn Binding="{Binding OSVersion}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="OS Version" Width="Auto" /> 
       </sdk:DataGrid.Columns> 

      </sdk:DataGrid> 
      <ListBox Grid.Row="2" ItemsSource="{Binding Data}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding DeviceId}"></TextBlock> 
          <Button Content="Select"> 
           <i:Interaction.Triggers> 
            <i:EventTrigger EventName="Click"> 
             <i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" /> 
            </i:EventTrigger> 
           </i:Interaction.Triggers> 
          </Button> 
         </StackPanel>       
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </Grid> 
+0

Nadie sabe ..? – katit

+0

¿Por qué está utilizando un EventTrigger en lugar de usar la propiedad Command del botón? – Jehof

+0

@Jehof El uso del comando presenta el mismo problema. Estoy utilizando el desencadenador de eventos para la coherencia a lo largo de la aplicación – katit

Respuesta

18

Estoy bastante seguro de que dentro de un DataGrid, todavía necesita el DataContextProxy para hacer que las fijaciones funcionen. La unión ElementName no funciona (sí, se está trabajando para ListBox plantillas, pero no DataGrid, esto se debe a DataGridTemplateColumn no está en el árbol visual), incluso en Silverlight 4.

ACTUALIZACIÓN

En Silverlight 5, DataContextProxy no es necesario en un DataGrid gracias al soporte de Ancestor binding.

Ejemplo

<Button Command="{Binding DataContext.CancelCommand, RelativeSource={RelativeSource AncestorType=sdk:DataGrid}}" /> 
+0

El valor RelativeSourceMode predeterminado es específico de la plataforma, por lo que también debe configurarlo, como

2

Creo que el problema es esta línea

<i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" /> 

causa en su XAML hay ningún elemento definido con el control de nombre (también conocido como x:. Name = "control")

debería cambiar ElementName = Control de a ElementName = LayoutRoot si el comando se define en la DataContext que está obligado a LayoutRoot.

No sé por qué esto funciona en el ListBox.

+0

Tengo x: Nombre = Control en mi control de usuario. Y funciona para ListBox – katit

Cuestiones relacionadas