【发布时间】:2010-09-25 01:13:58
【问题描述】:
我遇到了 WPF 和绑定到 ItemsControl 的 DataTemplate 内的按钮的命令的问题。场景非常简单。 ItemsControl 绑定到对象列表,我希望能够通过单击按钮来删除列表中的每个对象。按钮执行命令,命令负责删除。 CommandParameter 绑定到我要删除的对象。这样我就知道用户点击了什么。用户应该只能删除他们“自己的”对象 - 所以我需要在命令的“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>
如您所见,我有一个 Comments 对象列表。我希望将 DeleteCommentCommand 的 CommandParameter 绑定到 Command 对象。
所以我想我的问题是:以前有没有人遇到过这个问题? CanExecute 在我的命令上被调用,但参数第一次始终为 NULL - 为什么会这样?
更新:我能够稍微缩小问题范围。我添加了一个空的 Debug ValueConverter,以便在 CommandParameter 绑定数据时输出消息。原来问题在于 CanExecute 方法是在 CommandParameter 绑定到按钮之前执行的。我试图在命令之前设置命令参数(如建议的那样) - 但它仍然不起作用。关于如何控制它的任何提示。
Update2:有什么方法可以检测绑定何时“完成”,以便我可以强制重新评估命令?另外 - 我有多个绑定到同一命令对象实例的按钮(ItemsControl 中的每个项目一个)是否存在问题?
Update3:我已将错误的复制品上传到我的 SkyDrive:http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip
【问题讨论】:
-
我有完全相同的问题,使用 ListBox。
-
目前有一个针对 WPF 的针对此问题的错误报告:github.com/dotnet/wpf/issues/316
标签: wpf data-binding xaml .net-3.5 command