- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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/
我遇到过这个 html: 上面的html和这个有什么区别: 最佳答案 来自MDN page on the tag : 对于 type 的属性标签,可能的值是: 提交:按钮将表单数据提交给服务器
Button button= (Button) findViewbyID(R.id.button); 和 Button button = new Button(this); 有什么区别? 最佳答案 有
我是一名优秀的程序员,十分优秀!