我目前有一个带有rowdetailstemplate的数据网格,其中包含另一个数据网格,用于显示父对子关系。第二个网格有一个列,其中包含一个按钮,单击该按钮时会显示另一个对话框。
第一次显示行的详细信息时,用户必须在子网格中单击一次以获得焦点/激活它,然后再次单击以触发按钮单击事件。这仅在第一次显示行时发生。
就像第一次点击被网格吞没一样。 我已经尝试捕获RowDetailsVisibilityChanged事件以尝试聚焦按钮,但它似乎仍然没有解决问题。
有什么想法吗?
答案 0 :(得分:4)
我会回答我自己的评论,也可能对其他人有所帮助。 以下MSDN条目解释并解决了该问题: http://social.msdn.microsoft.com/Forums/vstudio/en-US/2cde5655-4b8d-4a12-8365-bb0e4a93546f/activating-input-controls-inside-datagrids-rowdetailstemplate-with-single-click?forum=wpf
问题是始终显示的行详细信息需要首先获得焦点。 要解决该问题,需要使用数据网格预览处理程序:
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource {x:Type DataGridRow}}">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="SelectRowDetails"/>
</Style>
</DataGrid.RowStyle>
注意:我已将其扩展,因为它会破坏我的自定义DataGridRow样式以继承当前使用的样式。
处理程序本身是
private void SelectRowDetails(object sender, MouseButtonEventArgs e)
{
var row = sender as DataGridRow;
if (row == null)
{
return;
}
row.Focusable = true;
row.Focus();
var focusDirection = FocusNavigationDirection.Next;
var request = new TraversalRequest(focusDirection);
var elementWithFocus = Keyboard.FocusedElement as UIElement;
if (elementWithFocus != null)
{
elementWithFocus.MoveFocus(request);
}
}
它将焦点设置为行详细信息的内容,从而解决了点击两次的问题。
注意:这一切都来自MSDN线程,它不是我自己的解决方案。
答案 1 :(得分:1)
我找到了一个很好的解决方案:D
我有一行代码解决了这个问题,但有10行来描述问题所在。 这是解决方案:
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
// to stop RowDetails from eating the first click.
if (e.Property.Name == "SelectedItem" && CurrentItem == null) CurrentItem = SelectedItem;
}
请详细了解here。