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