2009-05-18 31 views
7

Tôi muốn lấy giá trị của thuộc tính lồng nhau của một đối tượng (giống như Person.FullName.FirstName). Tôi thấy rằng trong. Net có một lớp có tên là PropertyPath, mà WPF sử dụng cho một mục đích tương tự trong Binding. Có cách nào để tái sử dụng cơ chế của WPF hay không hoặc tôi có nên tự viết một mình hay không.Có cách nào để có được một giá trị tài sản của một đối tượng sử dụng lớp PropertyPath không?

Trả lời

12

Sử dụng lại PropertyPath là hấp dẫn vì nó hỗ trợ truyền tải các thuộc tính lồng nhau khi bạn chỉ ra và lập chỉ mục. Bạn có thể tự viết chức năng tương tự, tôi có bản thân mình trong quá khứ nhưng nó liên quan đến phân tích cú pháp văn bản bán phức tạp và rất nhiều công việc phản chiếu.

Như Andrew đã chỉ ra rằng bạn có thể đơn giản sử dụng lại PropertyPath từ WPF. Tôi giả sử bạn chỉ muốn đánh giá con đường đó chống lại một đối tượng mà bạn có trong trường hợp mã là một chút tham gia. Để đánh giá PropertyPath, nó phải được sử dụng trong một ràng buộc chống lại DependencyObject. Để chứng minh điều này, tôi vừa tạo một DependencyObject đơn giản gọi là BindingEvaluator có một DependencyProperty duy nhất. Ma thuật thực sự sau đó xảy ra bằng cách gọi BindingOperations.SetBinding áp dụng ràng buộc để chúng ta có thể đọc giá trị được đánh giá.

var path = new PropertyPath("FullName.FirstName"); 

var binding = new Binding(); 
binding.Source = new Person { FullName = new FullName { FirstName = "David"}}; // Just an example object similar to your question 
binding.Path = path; 
binding.Mode = BindingMode.TwoWay; 

var evaluator = new BindingEvaluator(); 
BindingOperations.SetBinding(evaluator, BindingEvaluator.TargetProperty, binding); 
var value = evaluator.Target; 
// value will now be set to "David" 


public class BindingEvaluator : DependencyObject 
{ 
    public static readonly DependencyProperty TargetProperty = 
     DependencyProperty.Register(
      "Target", 
      typeof (object), 
      typeof (BindingEvaluator)); 

    public object Target 
    { 
     get { return GetValue(TargetProperty); } 
     set { SetValue(TargetProperty, value); } 
    } 
} 

Nếu bạn muốn mở rộng điều này, bạn có thể kết nối các sự kiện PropertyChanged để hỗ trợ giá trị đọc thay đổi. Tôi hi vọng cái này giúp được!

+1

Bạn sẽ viết lại cho tài sản đó bằng cách nào? –

+0

Tôi vừa cập nhật mẫu mã để bao gồm Cập nhật mục tiêu. Bạn chỉ cần đảm bảo Binding là TwoWay và cung cấp một setter. –

0

Tôi không thấy lý do nào khiến bạn không thể sử dụng lại.

Xem PropertyPath:

Thực hiện một cấu trúc dữ liệu cho mô tả một tài sản như một con đường bên dưới tài sản khác, hoặc dưới một sở hữu loại. Đường dẫn thuộc tính được sử dụng trong dữ liệu ràng buộc với các đối tượng và trong bảng phân cảnh và mốc thời gian cho hoạt ảnh.

Các vấn đề liên quan