gpt4 book ai didi

c# - WPF MVVM : Set focus to current selected item in Datagrid on button click

转载 作者:行者123 更新时间:2023-11-30 15:56:25 35 4
gpt4 key购买 nike

我在 Visual Studio 2008 和 NET Framework 3.5 SP1 中有一个 MVVM WPF 应用程序。在其他控件中,此应用有一个数据网格和一个按钮。

按钮:

<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 属性,但它不起作用。我也尝试在不指定路径的情况下按原样设置:

FocusManager.FocusedElement="{Binding ElementName=myDataGrid}"

在第一次尝试中,没有在属性中设置路径:

FocusManager.FocusedElement="{Binding ElementName=myDataGrid}"

当我单击键盘中向上箭头键的向下键时(单击按钮后),它会将焦点更改为 UI 中的另一个控件,该控件不是数据网格中的当前选定项。

第二次尝试,在属性中设置Path:

FocusManager.FocusedElement="{Binding ElementName=myDataGrid, Path=SelectedItem}"

它什么都不做,既不关注数据网格中的当前选定项,也不关注任何其他控件。

我还尝试了附加行为,如 here 所述但它不起作用:

<Button Grid.Column="1" Command="{Binding CalculateCommand}" classes:EventFocusAttachment.ElementToFocus="{Binding ElementName=myDataGrid}" HorizontalAlignment="Right">

另一次尝试:

它适用于第二次按键点击,第一次点击被忽略。

    private void Button_Click_1(object sender, RoutedEventArgs e)
{
if (myDataGrid.SelectedIndex > -1)
{
var selectedRow = (Microsoft.Windows.Controls.DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(myDataGrid.SelectedIndex);
FocusManager.SetIsFocusScope(selectedRow, true);
FocusManager.SetFocusedElement(selectedRow, selectedRow);
}
}

@Evk 解决方案完美运行。

最佳答案

以下应该有效:

if (myDataGrid.SelectedIndex > -1) {
var container = (DataGridRow) myDataGrid.ItemContainerGenerator.ContainerFromIndex(myDataGrid.SelectedIndex);
if (container != null) {
container.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}

您可以将该代码放入 Button.Click 事件中(这里没有错,我们正在做的完全是仅供查看的事情)或者如果您不喜欢代码隐藏,您可以创建附件属性\行为。

关于c# - WPF MVVM : Set focus to current selected item in Datagrid on button click,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46908260/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com