2011-09-28 21 views
13

ViewModel'e eklenmiş olan (XAML dahil) View komutum var. DataGrid satırındaki Düğme tıklandığında komutu çağırmam gerekiyor. Bunun için davranışları kullanıyorum (düzenli komutlar aynı soruna sahip). DataGrid'de düğmesine tıkladığımda - komutum işten çıkarılmıyor.DataGridTemplateColumn içindeki Bağlama Komutu

Sorunu açıklamak için - ListBox'ı EXACT ile aynı ciltleme eşyasına yerleştirdim - ve evet, komut çalışıyor. . Yani, DataGrid/DataGridTemplateColumn ile bir şey

<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

kimse bilmiyor ..? – katit

+0

Düğmenin Command özelliğini kullanmak yerine neden bir EventTrigger kullanıyorsunuz? – Jehof

+0

@Jehof Kullanımı komutu aynı sorunu gösterir. – katit

cevap

18

DataGrid içinde oldukça eminim, bağlama işlemlerini yapmak için hala DataContextProxy'a ihtiyacınız var. (DataGridTemplateColumn görsel ağacında olmadığından ListBox şablonlar için evet, çalışıyor, ancak DataGrid, bu) bile UPDATE

Silverlight 4'te, bağlayıcı ElementName çalışmıyor

yılında Ancestor bağlamasının desteği sayesinde DataGrid'da Silverlight 5, DataContextProxy'a gerek yoktur.

Örnek

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

için geçerlidir. Varsayılan RelativeSourceMode değeri, platforma özeldir, bu nedenle,

2

Ben sorunun XAML bu hat

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

nedeni olduğunu düşünüyorum aka adı Kontrolü (ile tanımlanmış bir eleman mi x: Adı = "Kontrol"). Komut LayoutRoot bağlı olduğu DataContext üzerinde tanımlanması durumunda

Sen ElementName LayoutRoot için ElementName = Kontrol değişmelidir.

Bunun neden bunun neden bir liste kutusu içinde çalıştığını bilmiyorum.

+0

Bende x: İsim = Kullanıcı kontrolümde kontrol. ListBox – katit