2014-04-24 111 views
0

我有一个数据网格的问题,其中一列是一个带有ContextMenu的文本框。但问题是,然后我右键单击文本框的行未选中。这意味着它可以在错误的地方设置值。在下面的图片中显示了这个问题。我右键单击了最上面的一行,但它仍然选择了下面的行,这意味着如果我选择“Mixed Paint”,它会将图片插入到预定行的下方。 enter image description hereWpf Datagrid文本框行选择

这是列代码:

<DataGridTemplateColumn Header="{wpfTx:Translate Action}" IsReadOnly="false" Width="*"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBox Text="{Binding Action, Mode=TwoWay}" TextWrapping="Wrap" BorderThickness="0" BorderBrush="Transparent"> 
            <TextBox.ContextMenu> 
             <ContextMenu> 
              <MenuItem ItemsSource="{Binding ActionMenu}"> 
               <MenuItem.Icon> 
                <controls:Icon IconKeyName="Config" Height="45" Width="45"/> 
               </MenuItem.Icon> 
               <MenuItem.Header > 
                <Label Content="Standard actions" VerticalContentAlignment="Center" FontSize="16" FontWeight="Bold"/> 
               </MenuItem.Header> 
               <MenuItem.ItemTemplate> 
                <DataTemplate> 
                 <MenuItem Command="{Binding ActionMenuCommand}" CommandParameter="{Binding}"> 
                  <MenuItem.Header> 
                   <Label Content="{Binding Description}" FontSize="16" FontWeight="Bold"/> 
                  </MenuItem.Header> 
                  <MenuItem.Icon> 
                   <controls:Icon IconKeyName="Edited" Height="45" Width="45"/> 
                  </MenuItem.Icon> 
                 </MenuItem> 
                </DataTemplate> 
               </MenuItem.ItemTemplate> 
              </MenuItem> 
             </ContextMenu> 
            </TextBox.ContextMenu> 
           </TextBox> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 

回答

1

我找到了解决问题的办法:

在XAML代码中,我添加了这个:

<DataGrid MouseRightButtonUp="UIElement_OnMouseRightButtonUp" Name="dataGrid1"></DataGrid> 

和代码背后:

private void UIElement_OnMouseRightButtonUp(object sender, MouseButtonEventArgs e) 
     { 
      var dep = (DependencyObject)e.OriginalSource; 
      while ((dep != null) && !(dep is DataGridCell)) 
      { 
       dep = VisualTreeHelper.GetParent(dep); 
      } 
      if (dep == null) return; 

      if (dep is DataGridCell) 
      { 
       var cell = dep as DataGridCell; 
       cell.Focus(); 

       while ((dep != null) && !(dep is DataGridRow)) 
       { 
        dep = VisualTreeHelper.GetParent(dep); 
       } 
       var row = dep as DataGridRow; 
       dataGrid1.SelectedItem = row.DataContext; 
      } 
     }