C# WPF MVVM:单击按钮将焦点设置为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">

我在VisualStudio2008和NetFramework3.5SP1中有一个MVVMWPF应用程序。在其他控件中,这个应用程序有一个datagrid和一个按钮

按钮

<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中的下一项,而是下一个控件根据我是单击向上还是向下箭头键获得焦点。