WPF ve ItemsControl'ün DataTemplate içindeki bir Düğmeye bağlı Komutlar ile ilgili bir sorunla karşılaştım. Senaryo oldukça yalındır. ItemsControl bir nesne listesine bağlıdır ve listedeki her nesneyi bir Düğmeye tıklayarak kaldırabilmek istiyorum. Düğme bir Komutu yürütür ve Komut silme işlemiyle ilgilenir. CommandParameter, silmek istediğim Nesneye bağlıdır. Bu şekilde kullanıcının neyi tıkladığını bilirim. Bir kullanıcı yalnızca "kendi" nesnelerini silebilmelidir - bu nedenle, kullanıcının doğru izinlere sahip olduğunu doğrulamak için Komutun "CanExecute" çağrısında bazı kontroller yapmam gerekiyor.
Sorun, CanExecute'a iletilen parametrenin ilk çağrıldığında NULL olmasıdır - bu nedenle komutu etkinleştirmek / devre dışı bırakmak için mantığı çalıştıramıyorum. Ancak, bunu her zaman etkinleştirirsem ve ardından komutu yürütmek için düğmeye tıklarsam, CommandParameter doğru şekilde geçirilir. Bu, CommandParameter'a karşı bağlamanın çalıştığı anlamına gelir.
ItemsControl ve DataTemplate için XAML şu şekilde görünür:
<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>
Gördüğünüz gibi, Yorumlar nesnelerinin bir listesine sahibim. DeleteCommentCommand öğesinin CommandParameter öğesinin Command nesnesine bağlanmasını istiyorum.
Sanırım sorum şu: bu sorunu daha önce yaşayan var mı? CanExecute, Komutumda çağrılıyor, ancak parametre her zaman ilk seferinde NULL - bu neden?
Güncelleme: Sorunu biraz azaltabildim. CommandParameter veri bağlandığında bir mesaj çıktılayabilmek için boş bir Debug ValueConverter ekledim. Sorunun, CommandParameter düğmeye bağlanmadan önce CanExecute yönteminin yürütülmesi olduğu ortaya çıktı. CommandParameter'ı Command'dan önce ayarlamayı denedim (önerildiği gibi) - ama yine de çalışmıyor. Nasıl kontrol edileceğine dair herhangi bir ipucu.
Güncelleme2: Bağlamanın ne zaman "tamamlandığını" saptamanın bir yolu var mı, böylece komutun yeniden değerlendirilmesini zorlayabilir miyim? Ayrıca bir Command nesnesinin aynı örneğine bağlanan birden çok Düğmeye (ItemsControl'deki her öğe için bir tane) sahip olmam bir sorun mu?
Güncelleme3: Hatanın bir kopyasını SkyDrive'ıma yükledim: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip