15
WPF CommandParameter首次调用NULL时为NULL
WPF和Commands绑定到ItemsControl的DataTemplate内部的Button时,我遇到了问题。该场景非常简单。ItemsControl绑定到对象列表,我希望能够通过单击按钮来删除列表中的每个对象。按钮执行命令,命令负责删除。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> 如您所见,我有一个Comments对象列表。我希望DeleteCommentCommand的CommandParameter绑定到Command对象。 所以我想我的问题是:以前有人遇到过这个问题吗?CanExecute在我的Command上被调用,但是第一次该参数始终为NULL-为什么? 更新:我能够将问题缩小一点。我添加了一个空的Debug ValueConverter,以便在CommandParameter与数据绑定时可以输出一条消息。原来的问题是,在CommandParameter绑定到按钮之前执行了CanExecute方法。我尝试在Command之前设置CommandParameter(如建议的那样)-但它仍然无法正常工作。有关如何控制它的任何提示。 Update2:有什么方法可以检测到绑定何时“完成”,以便我可以强制重新评估命令?另外-我是否有多个按钮(ItemsControl中的每个项目一个按钮)绑定到Command对象的同一实例,这是一个问题吗? Update3:我已将错误的复制品上传到我的SkyDrive:http : //cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip