C# WPF MVVM:单击按钮将焦点设置为Datagrid中的当前选定项
我在VisualStudio2008和NetFramework3.5SP1中有一个MVVMWPF应用程序。在其他控件中,这个应用程序有一个datagrid和一个按钮 按钮:C# WPF MVVM:单击按钮将焦点设置为Datagrid中的当前选定项,c#,wpf,mvvm,datagrid,focus,C#,Wpf,Mvvm,Datagrid,Focus,我在VisualStudio2008和NetFramework3.5SP1中有一个MVVMWPF应用程序。在其他控件中,这个应用程序有一个datagrid和一个按钮 按钮: <Button Grid.Column="1" Command="{Binding CalculateCommand}" FocusManager.FocusedElement="{Binding ElementName=myDataGrid}" HorizontalAlignment="Right">
<Button Grid.Column="1" Command="{Binding CalculateCommand}" FocusManager.FocusedElement="{Binding ElementName=myDataGrid}" HorizontalAlignment="Right">
<Button.Style>
<Style TargetType="Button">
<Setter Property="IsEnabled" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=myDataGrid, Path=SelectedItem}" Value="{x:Null}">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<Image VerticalAlignment="Center" Source="/MyWPFApp;component/Images/Calculate.png"></Image>
<TextBlock VerticalAlignment="Center">Calculate</TextBlock>
</StackPanel>
</Button>
在第一次尝试中,在不设置属性中的路径的情况下:
FocusManager.FocusedElement="{Binding ElementName=myDataGrid}"
FocusManager.FocusedElement="{Binding ElementName=myDataGrid, Path=SelectedItem}"
当我单击键盘上的向下箭头键(单击按钮后),它会将焦点更改为UI中的另一个控件,该控件不是datagrid中当前选定的项
在第二次尝试中,在属性中设置路径:
FocusManager.FocusedElement="{Binding ElementName=myDataGrid}"
FocusManager.FocusedElement="{Binding ElementName=myDataGrid, Path=SelectedItem}"
它什么也不做,既不在datagrid中的当前选定项中,也不在任何其他控件中
此外,我还尝试了上述附加行为,但不起作用:
<Button Grid.Column="1" Command="{Binding CalculateCommand}" classes:EventFocusAttachment.ElementToFocus="{Binding ElementName=myDataGrid}" HorizontalAlignment="Right">
@Evk解决方案工作正常。以下各项应能正常工作:
if (myDataGrid.SelectedIndex > -1) {
var container = (DataGridRow) myDataGrid.ItemContainerGenerator.ContainerFromIndex(myDataGrid.SelectedIndex);
if (container != null) {
container.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}
您可以将代码放入
按钮。单击事件(这里没有错,我们正在做的是完全只查看一件事),或者如果您不喜欢后面的代码,您可以从中创建附加属性\行为。如果我是您,我只需在按钮中将焦点设置为网格。单击事件,因为这是完全查看一件事,与视图模型无关。如果您出于某种原因讨厌代码隐藏,您可以对附加的属性\行为执行相同的操作。@Evk请参阅本文的最后一行,我刚刚更新了。我尝试并附加了行为,但它不起作用。因此,这意味着即使是简单的按钮。使用myDataGrid.Focus()
inside单击处理程序也不起作用?@Evk使用简单的按钮。单击事件并在按钮内设置myDataGrid.Focus()。单击代码隐藏中的事件不起作用。当我按下向上/向下箭头键时,它不会移动到datagrid中的下一项,而是下一个控件根据我是单击向上还是向下箭头键获得焦点。