我遇到了 WPF 和命令的问题,这些命令绑定到 ItemsControl 的 DataTemplate 中的 Button。情况很简单。ItemsControl 绑定到一个对象列表,我希望能够通过单击 Button 删除列表中的每个对象。Button 执行一个 Command,Command 负责删除。CommandParameter 绑定到要删除的对象。这样我就知道用户点击了什么。用户应该只能删除他们的“自己的”对象——所以我需要在 Command 的“ CanExecute”调用中做一些检查,以验证用户是否拥有正确的权限。
问题是传递给 CanExecute 的参数在第一次调用时为 NULL-所以我不能运行逻辑来启用/禁用命令。但是,如果我始终启用它,然后单击按钮执行命令,CommandParameter 将被正确传入。因此,这意味着针对 CommandParameter 的绑定正在工作。
ItemsControl 和 DataTemplate 的 XAML 如下:
<ItemsControl
x:Name="commentsList"
ItemsSource="{Binding Path=SharedDataItemPM.Comments}"
Width="Auto" Height="Auto">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button
Content="Delete"
FontSize="10"
Command="{Binding Path=DataContext.DeleteCommentCommand, ElementName=commentsList}"
CommandParameter="{Binding}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
所以你可以看到我有一个评论对象的列表。我希望 DeleteCommentCommand 的 CommandParameter 绑定到 Command 对象。
所以我想我的问题是: 以前有人经历过这个问题吗?CanExecute 在我的 Command 上被调用,但是第一次调用时参数总是 NULL-为什么?
更新: 我能够把问题缩小一点。我添加了一个空的 Debug ValueConverter,以便在 CommandParameter 数据绑定时输出消息。问题在于 CanExecute 方法是在 CommandParameter 绑定到按钮之前执行的。我曾试图在 Command 之前设置 CommandParameter (像建议的那样)-但它仍然不起作用。有什么控制方法吗。
Update2: 有没有什么方法可以检测绑定何时“完成”,以便我可以强制重新评估命令?另外,我有多个按钮(ItemsControl 中的每个项目都有一个)绑定到 Command 对象的同一个实例,这是一个问题吗?
更新3: 我已经上传了一个 bug 的复制品到我的 SkyDrive: < a href = “ http://cid-1a08c11c407c0d8e.SkyDrive. live.com/self.aspx/code% 20sample/CommandParameter terBinding.zip”rel = “ noReferrer”> http://cid-1a08c11c407c0d8e.SkyDrive.live.com/self.aspx/code%20samples/commandparameterbinding.zip