WPF 命令绑定中的错误(?)

Bug(?) in WPF Command Binding

我正在使用 WPF (.NET 4.5) 和 VB.NET 以及 MVVM Light。我的 Toolbar 中的 Button 绑定到底层 VM 的 RelayCommandButton 在 XAML 中看起来像这样:

<Button Command="{Binding Path=BringLayerForwardCommand}" CommandParameter="{Binding SelectedLayer}">

底层命令在 ViewModel 中是这样声明的:

Public Property BringLayerForwardCommand As New RelayCommand(Of Layer) _ 
  (Sub(p) BringLayerForward_Executed(p), _
  Function(p) p IsNot Nothing AndAlso _
              Me.Layers IsNot Nothing AndAlso 
              (p.ZOrder < Me.Layers.Where(Function(l) l.IsFront = p.IsFront).Max(Function(l2) l2.ZOrder)))

Button 在运行时的行为如下:

  1. 它永远不会启用。
  2. CanExecute 部分的断点(上面 RelayCommand 构造函数的第二个参数)永远不会被击中。
  3. 如果我从匿名函数中删除 lambda 部分,断点开始被击中并且 Button 被启用。

去掉 lambda 部分后,上面的命令如下所示:

Public Property BringLayerForwardCommand As New RelayCommand(Of Layer) _
  (Sub(p) BringLayerForward_Executed(p), _
  Function(p) p IsNot Nothing AndAlso _
              Me.Layers IsNot Nothing)

这是一个错误还是我真的遗漏了一些明显的东西?

编辑

进一步调查表明,如果我将整个匿名函数移至常规函数,一切都会开始正常工作。真的好像是个bug。

我想你可能需要一些关于这个问题的关闭 ;)。

我怀疑是 "Issue 7721: Closures not working with RelayCommand" 请参阅:http://www.mvvmlight.net/installing/changes

此错误已在 5.4.1 中修复。