2011-09-28 25 views
13

I have View (XAML incluso) allegato al mio ViewModel con i comandi. Devo richiamare il comando quando si fa clic sul pulsante nella riga di DataGrid. Sto usando i comportamenti per questo (il comando regolare ha lo stesso problema). Quando clicco su DataGrid - il mio comando non viene licenziato.Comando di associazione all'interno DataGridTemplateColumn

Per illustrare il problema - Ho posizionato ListBox su un fondo con EXACT stessa roba di binding - e sì, il comando funziona. Quindi, è qualcosa 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

Nessuno lo sa ..? – katit

+0

Perché stai utilizzando un EventTrigger invece di utilizzare la proprietà Comando del pulsante? – Jehof

+0

@Jehof L'utilizzo del comando presenta lo stesso problema. Sto usando il trigger di evento per coerenza nell'applicazione – katit

risposta

18

Sono abbastanza sicuro che all'interno di uno DataGrid, è ancora necessario il DataContextProxy per rendere funzionanti binding. L'ElementName vincolante non funziona (sì, si sta lavorando per ListBox modelli, ma non DataGrid, questo è perché DataGridTemplateColumn non si trova nella struttura visiva), anche in Silverlight 4.

UPDATE

In Silverlight 5, DataContextProxy non è necessario in un DataGrid grazie al supporto di associazione Ancestor.

Esempio

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

Il valore RelativeSourceMode predefinito è specifico della piattaforma, quindi dovresti anche impostarlo, come

2

Credo che il problema è questa linea

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

causa nel tuo XAML non è elemento definito con il nome di controllo (aka x:. Name = "Control").

si dovrebbe cambiare ElementName = controllo a ElementName = LayoutRoot se il comando è definita sul DataContext che è destinato a LayoutRoot.

Non so perché funzioni nel ListBox.

+0

Ho x: Name = Control sul mio controllo utente. E funziona per ListBox – katit

Problemi correlati