2011-09-28 13 views
13

Mam widok (dołączony XAML) dołączony do mojego ViewModel za pomocą poleceń. Muszę wywołać polecenie, gdy kliknięto przycisk Button w wierszu DataGrid. Używam do tego zachowań (regularne polecenia mają ten sam problem). Kiedy klikam przycisk na DataGrid - moje polecenie nie zostanie zwolnione.Polecenie powiązania wewnątrz DataGridTemplateColumn

Aby zilustrować problem - umieściłem ListBox na dnie z dokładnie tymi samymi powiązaniami - i tak działa polecenie. Tak, to coś z 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

Nikt nie wie ..? – katit

+0

Dlaczego używasz EventTrigger zamiast używać właściwości Command przycisku? – Jehof

+0

@Jehof Użycie polecenia przedstawia ten sam problem. Używam wyzwalacza zdarzeń dla spójności w całej aplikacji – katit

Odpowiedz

18

Jestem prawie pewien, że wewnątrz DataGrid nadal potrzebujesz DataContextProxy, aby powiązania działały. ElementName wiązania nie działa (tak, to pracuje dla ListBox szablonów, ale nie DataGrid, to dlatego DataGridTemplateColumn nie jest w drzewie wizualne), nawet w Silverlight 4.

UPDATE

W Silverlight 5, DataContextProxy nie jest potrzebny w DataGrid dzięki wsparciu wiązania Ancestor.

Przykład

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

Domyślna wartość RelativeSourceMode jest zależna od platformy, więc powinieneś ją ustawić, np.

2

Myślę, że problemem jest to linia

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

przyczyna w XAML nie jest elementem zdefiniowany kontroli Nazwa (aka x. Name = "Control").

należy zmienić ElementName = kontrola do ElementName = LayoutRoot jeżeli polecenie jest zdefiniowane na DataContext, który jest związany LayoutRoot.

Nie wiem, dlaczego to działa w ListBox.

+0

Mam x: Name = Kontrola na mojej kontroli użytkownika. I działa dla ListBox – katit

Powiązane problemy