У меня возникла проблема с WPF и командами, привязанными к Button внутри DataTemplate элемента ItemsControl. Сценарий довольно прямолинейный. Элемент ItemsControl привязан к списку объектов, и я хочу, чтобы удалить каждый объект в списке, нажав кнопку. Кнопка выполняет команду, и команда позаботится об удалении. CommandParameter привязан к объекту, который я хочу удалить. Таким образом, я знаю, что пользователь нажал. Пользователь должен только удалять свои "собственные" объекты, поэтому мне нужно выполнить некоторые проверки в вызове "CanExecute" команды, чтобы убедиться, что пользователь имеет права доступа.
Проблема в том, что параметр, переданный в CanExecute, является NULL при первом вызове, поэтому я не могу запустить логику, чтобы включить/отключить эту команду. Однако, если я сделаю это всегда включенным, а затем нажмите кнопку, чтобы выполнить команду, CommandParameter передается правильно. Таким образом, это означает, что привязка к CommandParameter работает.
XAML для ItemsControl и DataTemplate выглядит следующим образом:
<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. Я хочу, чтобы CommandParameter команды DeleteCommentCommand был связан с объектом Command.
Итак, я думаю, мой вопрос: кто-нибудь испытал эту проблему раньше? CanExecute вызывается в моей команде, но параметр всегда имеет значение NULL в первый раз - почему?
Обновление: Я смог немного уменьшить проблему. Я добавил пустой Debug ValueConverter, чтобы я мог выводить сообщение, когда CommandParameter привязан к данным. Оказывается, проблема заключается в том, что метод CanExecute выполняется до того, как CommandParameter привязан к кнопке. Я попытался установить CommandParameter перед Command (как предлагается), но он все равно не работает. Любые советы о том, как управлять им.
Update2: Есть ли способ обнаружить, когда привязка "выполнена", чтобы я мог заставить переоценку команды? Кроме того, проблема в том, что у меня есть несколько кнопок (по одному для каждого элемента в ItemsControl), которые привязаны к одному экземпляру командного объекта?
Update3: Я загрузил репликацию ошибки на свой SkyDrive: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip