Tôi đã gặp sự cố với WPF và Các lệnh được liên kết với một Nút bên trong DataTemplate của một ItemsControl. Kịch bản khá thẳng về phía trước. ItemsControl được liên kết với một danh sách các đối tượng và tôi muốn có thể xóa từng đối tượng trong danh sách bằng cách nhấp vào một Nút. Nút thực hiện một Lệnh và Lệnh sẽ xử lý việc xóa. CommandParameter được liên kết với Đối tượng mà tôi muốn xóa. Bằng cách đó, tôi biết người dùng đã nhấp vào gì. Người dùng chỉ có thể xóa các đối tượng "của riêng mình" - vì vậy tôi cần thực hiện một số kiểm tra trong lệnh gọi "CanExecute" của Lệnh để xác minh rằng người dùng có quyền phù hợp.
Vấn đề là tham số được truyền cho CanExecute là NULL vào lần đầu tiên nó được gọi - vì vậy tôi không thể chạy logic để bật / tắt lệnh. Tuy nhiên, nếu tôi luôn bật tính năng này và sau đó nhấp vào nút để thực hiện lệnh, thì CommandParameter sẽ được chuyển vào chính xác. Vì vậy, điều đó có nghĩa là ràng buộc chống lại CommandParameter đang hoạt động.
XAML cho ItemsControl và DataTemplate trông giống như sau:
<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>
Vì vậy, như bạn có thể thấy, tôi có một danh sách các đối tượng Nhận xét. Tôi muốn CommandParameter của DeleteCommentCommand được liên kết với đối tượng Command.
Vì vậy, tôi đoán câu hỏi của tôi là: đã có ai trải qua vấn đề này trước đây chưa? CanExecute được gọi trên Command của tôi, nhưng tham số luôn là NULL trong lần đầu tiên - tại sao vậy?
Cập nhật: Tôi đã có thể thu hẹp vấn đề xuống một chút. Tôi đã thêm một ValueConverter Debug trống để tôi có thể xuất ra thông báo khi CommandParameter bị ràng buộc dữ liệu. Hóa ra vấn đề là phương thức CanExecute được thực thi trước khi CommandParameter được liên kết với nút. Tôi đã cố gắng đặt CommandParameter trước Command (như được đề xuất) - nhưng nó vẫn không hoạt động. Bất kỳ lời khuyên về cách kiểm soát nó.
Update2: Có cách nào để phát hiện khi nào ràng buộc "xong", để tôi có thể buộc đánh giá lại lệnh không? Ngoài ra - có vấn đề là tôi có nhiều Nút (một cho mỗi mục trong ItemsControl) liên kết với cùng một phiên bản của đối tượng Lệnh không?
Cập nhật 3: Tôi đã tải lên bản sao của lỗi này lên SkyDrive của mình: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip