为什么DataBinding没有传播到UserControl
今天早上我在这里问了一个问题,做一个简单的工作样本给了我一个不同于预期的行为。
GitHub上的完整工作样本。 主要部分代码如下。
在本例中,如果UserControl直接用作Window的子节点,则命令永远不会传播到任何UserControl。 如果UserControl用作ListBox ItemTemplate的DataTemplate,它也不起作用。
我还包括一个黑客按钮来修复Command到达UserControls的问题。 黑客来自StackOverflow 。
但是使用hack并不能解释为什么UserControl没有收到Command(没有它)并且使用这个hack也打破了良好编码的第一条规则:“Hi cohesion and Low coupling”。 应该在窗口代码中使用hack来管理UserControl中的Command,我的想法是它应该默认发生。
为什么命令没有默认传播到UserControl,我该怎么做才能以干净的方式将命令传播给UserControl?
注意:在UserControl中仅使用一个CommandBinding(删除一个或另一个)不能解决问题。
部分代码:
1 2
用户控件:
您没有在用户控件上调用命令的原因是您的按钮不在单独的焦点范围内。 为了使WPF正确地为命令目标拾取聚焦元素,它需要在命令调用控件的单独焦点范围内。
框架将从按钮遍历可视树,在其焦点范围内查找命令绑定(在您的情况下,它将找不到任何)。 当框架在当前焦点范围内找不到任何命令绑定时,它才会查看聚焦元素的父焦点范围(在您的情况下,按钮位于没有父范围的Window
焦点范围中,因此搜索将在那里结束)。
只需在StackPanel
上设置FocusManager.IsFocusScope="True"
解决问题。
您还可以在按钮上指定CommandTarget
属性以指向用户控件而不依赖于焦点。