ฉันพบปัญหาเกี่ยวกับ WPF และคำสั่งที่ผูกไว้กับปุ่มภายใน DataTemplate ของ ItemsControl สถานการณ์ค่อนข้างตรงไปตรงมา ItemsControl ถูกผูกไว้กับรายการของวัตถุและฉันต้องการที่จะสามารถลบแต่ละวัตถุในรายการได้โดยคลิกที่ปุ่ม ปุ่มเรียกใช้คำสั่งและคำสั่งจะดูแลการลบ CommandParameter ถูกผูกไว้กับ Object ที่ฉันต้องการลบ ด้วยวิธีนี้ฉันรู้ว่าผู้ใช้คลิกอะไร ผู้ใช้ควรจะลบอ็อบเจกต์ "ของตัวเอง" ได้เท่านั้นดังนั้นฉันจึงต้องทำการตรวจสอบบางอย่างในการเรียก "CanExecute" ของ Command เพื่อตรวจสอบว่าผู้ใช้มีสิทธิ์ที่ถูกต้อง
ปัญหาคือพารามิเตอร์ที่ส่งไปยัง 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 ถูกเรียกใช้คำสั่งของฉัน แต่พารามิเตอร์เป็นโมฆะเสมอในครั้งแรก - ทำไมถึงเป็นเช่นนั้น
อัปเดต:ฉันสามารถ จำกัด ปัญหาให้แคบลงเล็กน้อย ฉันเพิ่ม Debug ValueConverter ที่ว่างเปล่าเพื่อให้ฉันสามารถส่งออกข้อความเมื่อ CommandParameter ถูกผูกไว้กับข้อมูล ปรากฎว่าปัญหาคือเมธอด CanExecute ถูกดำเนินการก่อนที่ CommandParameter จะผูกไว้กับปุ่ม ฉันได้พยายามตั้งค่า CommandParameter ก่อนคำสั่ง (ตามที่แนะนำ) - แต่ก็ยังไม่ได้ผล เคล็ดลับในการควบคุม
Update2:มีวิธีใดบ้างในการตรวจจับเมื่อการเชื่อม "เสร็จสิ้น" เพื่อที่ฉันจะบังคับให้ประเมินคำสั่งใหม่ได้ นอกจากนี้ - เป็นปัญหาที่ฉันมีหลายปุ่ม (หนึ่งปุ่มสำหรับแต่ละรายการใน ItemsControl) ที่ผูกกับอินสแตนซ์ของ Command-object เดียวกันหรือไม่
อัปเดต 3 :ฉันได้อัปโหลดการจำลองข้อบกพร่องไปยัง SkyDrive ของฉัน: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip