2011-09-28 10 views
13

Tôi có Chế độ xem (bao gồm XAML) được gắn với ViewModel của tôi bằng các lệnh. Tôi cần phải gọi lệnh khi nút trên hàng DataGrid nhấp vào. Tôi đang sử dụng hành vi cho điều này (lệnh thường xuyên có cùng một vấn đề). Khi tôi nhấp vào nút trên DataGrid - lệnh của tôi không bị sa thải.Lệnh ràng buộc bên trong DataGridTemplateColumn

Để minh họa sự cố - Tôi đã đặt ListBox ở phía dưới cùng với công cụ liên kết CHÍNH XÁC - và có, lệnh hoạt động. Vì vậy, nó là một cái gì đó với 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

Không ai biết ..? – katit

+0

Tại sao bạn sử dụng EventTrigger thay vì sử dụng thuộc tính Lệnh của nút? – Jehof

+0

@Jehof Sử dụng lệnh trình bày cùng một vấn đề. Tôi đang sử dụng kích hoạt sự kiện cho tính nhất quán trong suốt ứng dụng – katit

Trả lời

18

Tôi khá chắc chắn bên trong một DataGrid, bạn vẫn cần DataContextProxy để làm cho các liên kết hoạt động. Các ElementName ràng buộc không hoạt động (có, nó được làm việc cho ListBox mẫu, nhưng không DataGrid, điều này là do DataGridTemplateColumn không có trong cây thị giác), ngay cả trong Silverlight 4.

CẬP NHẬT

Trong Không cần sử dụng Silverlight 5, DataContextProxy trong một số DataGrid nhờ sự hỗ trợ của liên kết Tổ tiên.

Ví dụ

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

Giá trị RelativeSourceMode mặc định là nền tảng cụ thể, vì vậy bạn cũng nên đặt nó, như

2

Tôi nghĩ vấn đề là dòng này

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

nguyên nhân trong XAML của bạn không có yếu tố định nghĩa với tên Control (hay còn gọi là x:. Name = "Control").

Bạn nên thay đổi ElementName = Kiểm soát để ElementName = LayoutRoot nếu lệnh được định nghĩa trên DataContext đó là ràng buộc để LayoutRoot.

Tôi không biết tại sao tính năng này hoạt động trong ListBox.

+0

Tôi có x: Name = Kiểm soát trên điều khiển người dùng của tôi. Và nó hoạt động cho ListBox – katit