Wystąpił problem z WPF i poleceniami, które są powiązane z przyciskiem wewnątrz DataTemplate elementu ItemsControl. Scenariusz jest dość prosty. ItemsControl jest powiązany z listą obiektów i chcę mieć możliwość usunięcia każdego obiektu z listy, klikając przycisk. Przycisk wykonuje polecenie, a polecenie dba o usunięcie. CommandParameter jest powiązany z obiektem, który chcę usunąć. W ten sposób wiem, co kliknął użytkownik. Użytkownik powinien mieć możliwość usuwania tylko swoich „własnych” obiektów - dlatego muszę sprawdzić wywołanie „CanExecute” polecenia, aby sprawdzić, czy użytkownik ma odpowiednie uprawnienia.
Problem polega na tym, że parametr przekazany do CanExecute ma wartość NULL przy pierwszym wywołaniu - więc nie mogę uruchomić logiki, aby włączyć / wyłączyć polecenie. Jeśli jednak włączę to zawsze, a następnie kliknę przycisk, aby wykonać polecenie, parametr CommandParameter zostanie przekazany poprawnie. Oznacza to, że działa powiązanie z CommandParameter.
XAML dla ItemsControl i DataTemplate wygląda następująco:
<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>
Jak widać, mam listę obiektów komentarzy. Chcę, aby CommandParameter z DeleteCommentCommand był powiązany z obiektem Command.
Więc wydaje mi się, że moje pytanie brzmi: czy ktoś wcześniej doświadczył tego problemu? CanExecute jest wywoływana przez moje polecenie, ale za pierwszym razem parametr ma zawsze wartość NULL - dlaczego tak jest?
Aktualizacja: udało mi się trochę zawęzić problem. Dodałem pusty Debug ValueConverter, aby móc wyprowadzić komunikat, gdy parametr CommandParameter jest powiązany z danymi. Okazuje się, że problem polega na tym, że metoda CanExecute jest wykonywana przed przypisaniem CommandParameter do przycisku. Próbowałem ustawić CommandParameter przed poleceniem (jak sugerowano) - ale nadal nie działa. Wszelkie wskazówki, jak to kontrolować.
Aktualizacja2: Czy istnieje sposób na wykrycie, kiedy powiązanie jest „gotowe”, aby wymusić ponowną ocenę polecenia? Ponadto - czy jest to problem, że mam wiele przycisków (po jednym dla każdego elementu w ItemsControl), które są powiązane z tym samym wystąpieniem obiektu polecenia?
Update3: Przesłałem reprodukcję błędu do mojego SkyDrive: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip