Tôi có một bộ sưu tập các đối tượng được lưu trữ trong CollectionViewSource
và được liên kết với một số DataGrid
. Tôi muốn hiển thị 'chế độ xem chi tiết' của đối tượng hiện được chọn trong DataGrid
. Tôi có thể lấy đối tượng hiện tại bằng cách sử dụng CollectionViewSource.View.CurrentItem
.WPF: Tự động ràng buộc danh sách (một số) thuộc tính của đối tượng
MyClass
{
[IsImportant]
AProperty{}
AnotherProperty{}
[IsImportant]
YetAnotherProperty{}
}
Những gì tôi muốn làm là hiển thị một nhãn (với tên tài sản) và một điều khiển (để chỉnh sửa) trong một hộp danh sách, cho mỗi người trong số những tài sản được đánh dấu bằng các thuộc tính IsImportant
. Các ràng buộc phải làm việc giữa các chỉnh sửa được thực hiện, các DataGrid và đối tượng ủng hộ. Điều khiển được hiển thị sẽ thay đổi dựa trên loại thuộc tính, có thể là boolean
, string
hoặc IEnumerable<string>
(Tôi đã viết IValueConverter
để chuyển đổi giữa chuỗi có thể đếm được và dòng được phân tách bằng dấu gạch chéo).
Có ai biết phương pháp để thực hiện việc này không? Tôi hiện có thể hiển thị các giá trị của mỗi tài sản thông qua những điều sau đây, nhưng việc chỉnh sửa chúng sẽ không cập nhật các đối tượng ủng hộ:
listBox.ItemsSource = from p in typeof(MyClass).GetProperties()
where p.IsDefined(typeof(IsImportant), false)
select p.GetValue(_collectionViewSource.View.CurrentItem, null);
Để làm rõ, Tôi muốn điều này xảy ra 'automagically', mà không tự xác định tên thuộc tính trong XAML. Nếu tôi có thể tự động thêm vào XAML trong thời gian chạy dựa trên các thuộc tính nào được đánh dấu bằng thuộc tính, điều đó cũng sẽ ổn.
Điều đó có vẻ tuyệt vời; Tôi sẽ thực hiện nó ngay sau khi tôi có một cơ hội và cho bạn biết làm thế nào nó đi. Cảm ơn! –
Điều này hoạt động chủ yếu là tuyệt vời. Tôi chỉ cần thêm một kiểm tra null vào PropertyValueConverter, vì nó đã nhận được một đối tượng null khi ràng buộc được đặt đầu tiên. Vấn đề duy nhất là hiện tại, nếu tôi thay đổi một giá trị trên điều khiển này, nó sẽ không được truyền qua datagrid. Có lẽ là đối tượng sao lưu đang nhận được thay đổi, vì giá trị thay đổi vẫn được hiển thị bởi các itemscontrol, nhưng lưới điện không được thông báo. Đây có phải là để làm với Binding.DoNothing? –
@Daniel: Đối tượng của bạn sẽ cần triển khai INotifyPropertyChanged nếu bạn muốn các bản cập nhật được thực hiện bởi một điều khiển được phản ánh trong các điều khiển khác được liên kết với cùng một thuộc tính. Bạn cũng sẽ cần triển khai INotifyPropertyChanged trên PropertyValue. PropertyValueConverter là bản thân ràng buộc ItemsSource, là một chiều, vì vậy ConvertBack sẽ không được gọi và Binding.DoNothing sẽ không thành vấn đề. – Quartermeister