绑定到FocusManager.FocusedElement

7
我有一个应用程序,其中包含多个数据表格和导出到Excel的命令,该命令将聚焦的数据表格作为参数。是否可以将CommandParameter绑定到FocusManager.FocusedElement,还是必须明确设置它们?
提前感谢您的帮助。
2个回答

7

是的,您可以绑定到FocusedElement。类似于:

<Button ...
    CommandParameter="{Binding (FocusManager.FocusedElement), RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />

根据您的关注范围,您可能需要将窗口更改为另一个元素。

但是,个人建议设置命令处理程序以查看参数是否为空。如果为空,则可以通过编程方式获取FocusManager.FocusedElement

var element = parameter as DataGrid;
if (element == null)
    element = FocusManager.FocusedElement as DataGrid.

您可以根据需要向上搜索可视化树,以获取相关的DataGrid。

对于 XAML 方法,我给一个赞。但是对于代码部分,如果我正在遵循 MVVM 模式并且我的命令驻留在我的 ViewModel 中,我不应该从那里访问我的 UI 对象。对吧? - Rohit Vats
1
@RV1987- 如果您通过CommandParameter传递它,则仍在访问UI对象 :) - CodeNaked
Xaml的方法对我不起作用,但可能是因为我使用的Fluent Ribbon出了问题。代码后台的方法可以工作,但你必须使用GetFocusedElement函数并将其引用传递给主窗口。 - Twelve

1
为什么不能在 ViewModel 上有一个 CLR 属性,比如说 "SelectedDataGrid",每当你的任何 DataGrid 获取焦点时更新它。在代码中简单地使用该属性,而不是从视图传递它。

我使用Prism并且有多个模块,所以我必须将此属性添加到每个视图模型中,这当然不是最好的想法。 - Twelve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接