Я зіткнувся з проблемою з WPF та командами, які прив’язані до кнопки всередині DataTemplate елемента ControlControl. Сценарій цілком прямий. 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 перед Command (як запропоновано), але він все одно не працює. Будь-які поради щодо того, як ним керувати.
Оновлення2: Чи є спосіб виявити, коли прив’язка «зроблена», щоб я міг змусити переоцінити команду? Також - чи проблема в тому, що у мене є кілька кнопок (по одній для кожного елемента в ItemsControl), які прив'язуються до одного і того ж екземпляра командного об'єкта?
Оновлення3: Я завантажив репродукцію помилки на свій SkyDrive: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip