2014-07-14 133 views
0

我有一个DataGrid,当用户点击向下箭头时,它需要移动到下面的下一行,但重点放在有文本框的单元格中。我不想关注文本框不是实际的单元格。这就是我的DataGrid的外观。WPF DataGrid将行选择更改为单元格的文本框

<DataGrid Name="myDataGrid" PreviewKeyDown="myDataGrid_PreviewKeyDown"> 
<DataGrid.Columns> 
    <DataGridTemplateColumn Header="Description" IsReadOnly="True" Width="Auto"> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
        <TextBlock HorizontalAlignment="Right" Text="{Binding Path=Descrip, Mode=TwoWay, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged, StringFormat=C, ConverterCulture=en-us}" TextAlignment="Right"/> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    <DataGridTemplateColumn Header="Units Counted" Width="Auto"> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <TextBox BorderBrush="Black" BorderThickness="2" FontWeight="Bold" Margin="2" Text="{Binding Path=UnitCounted, Mode=TwoWay, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}" TextAlignment="Right" /> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
</DataGrid.Columns> 

private void myDataGrid_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Down) 
     { 
      e.Handled = true; 
      int indx = myDataGrid.SelectedIndex + 1; 
      myDataGrid.SelectedIndex = indx; 
      myDataGrid.CurrentCell = new DataGridCellInfo(myDataGrid.Items[indx], myDataGrid.Columns[1]) 
     } 
    } 

这样做选择该小区不是文本框。如果我将它添加到文本框;

FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}" 

它为每行文本框添加一个光标,但不关注文本框。

谢谢

编辑:谢谢@Sheridan我更接近这个代码;

<TextBox 
BorderBrush="Black" 
BorderThickness="2" 
FontWeight="Bold" 
Margin="2" 
Text="{Binding Path=UnitCounted, Mode=TwoWay, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}" 
TextAlignment="Right" 
FocusManager.IsFocusScope="True" 
FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/> 

然后在我的myDataGrid_PreviewKeyDown将在myDataGrid.BeginEdit()允许为它工作。问题是,似乎BeginEdit从来没有真正结束。我该如何解决?

+1

我建议您阅读MSDN上的[Focus Overview](http://msdn.microsoft.com/en-us/library/aa969768(v = vs.110).aspx)页面。 *它将光标添加到每一行文本框,但不会将焦点放在文本框上*设置“FocusManager.FocusedElement”属性将*逻辑焦点*设置为其焦点范围内的一个元素* ......所以它们*专注,但只是*在他们的焦点范围内*。请阅读链接页面,了解如何管理您的重点需求。 – Sheridan

+0

请参阅上面的修改 – Xaphann

回答

1

我不会搞砸FocusManager.FocusedElement,因为你会得到未知的警告,它可以像你现在正在经历的BeginEdit一样。

我所做的专注于TextBox很简单,在XAML

<DataGrid Name="myDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding Loans}" PreviewKeyDown="UIElement_OnPreviewMouseDown"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="Units Counted" Width="Auto"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBox x:Name="sampleTextBox" HorizontalAlignment="Right" Text="{Binding Name}"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

,并在类文件中我有

public static T GetVisualChild<T>(Visual parent) where T : Visual 
    { 
     T child = default(T); 
     int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < numVisuals; i++) 
     { 
      Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
      child = v as T; 
      if (child == null) 
      { 
       child = GetVisualChild<T>(v); 
      } 
      if (child != null) 
      { 
       break; 
      } 
     } 
     return child; 
    } 

    private void UIElement_OnPreviewMouseDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key != Key.Down) return; 
     e.Handled = true; 
     var indx = myDataGrid.SelectedIndex + 1; 
     myDataGrid.SelectedIndex = indx; 
     myDataGrid.CurrentCell = new DataGridCellInfo(myDataGrid.Items[indx], myDataGrid.Columns[0]); 

     var row = this.myDataGrid.ItemContainerGenerator.ContainerFromItem(myDataGrid.CurrentCell.Item) as DataGridRow; 
     var presenter = GetVisualChild<DataGridCellsPresenter>(row); 


     var cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromItem(myDataGrid.CurrentCell.Item); 
     if (cell != null) 
     { 
      var contentPresenter = cell.Content as ContentPresenter; 
      if (contentPresenter != null) 
      { 
       var m = contentPresenter.ContentTemplate.FindName("sampleTextBox", contentPresenter); 
       ((TextBox) m).Focus(); 
      } 
     } 
    } 
} 

现在会做TextBox成为焦点,当Down关键是每次按下并更改单元格选择。

相关问题