2010-02-06 25 views
10

Tôi đang viết điều khiển tùy chỉnh và tôi có đường dẫn thuộc tính dưới dạng chuỗi (nghĩ comboBox.SelectedValuePath).
Cách tốt nhất trong mã để đánh giá chuỗi này cho một đối tượng tùy ý là gì?WPF Tôi nên đánh giá đường dẫn tài sản như thế nào?

Tôi rõ ràng chỉ có thể phân tích cú pháp đó, nhưng nó là một hack và tôi muốn đường dẫn hỗ trợ mọi thứ comboBox.SelectedValuePath thực hiện (để nhất quán).

quả (nhờ Aran Mulholland):

Không chắc về hiệu suất của việc này, nhưng tôi không quan tâm nhiều về việc thực hiện ngay bây giờ.

public class BindingEvaluator { 
    #region Target Class 

    private class Target : DependencyObject { 
     public static readonly DependencyProperty ResultProperty = DependencyProperty.Register(
      "Result", typeof(IEnumerable), typeof(BindingEvaluator) 
     ); 

     public object Result { 
      get { return this.GetValue(ResultProperty); } 
      set { this.SetValue(ResultProperty, value); } 
     } 
    } 

    #endregion 

    public object GetValue(object source, string propertyPath) { 
     var target = new Target(); 
     BindingOperations.SetBinding(target, Target.ResultProperty, new Binding(propertyPath) { 
      Source = source, 
      Mode = BindingMode.OneTime 
     }); 
     return target.Result; 
    } 
} 
+0

Có lưu ý rằng loại khai báo của DependencyProperty trong Target là IEnumerable khi thuộc tính Result là đối tượng kiểu? – dtm

+0

@ ddt có lẽ chỉ là lỗi của tôi - được đăng phiên bản trung gian thay vì cuối cùng. tuy nhiên đã lâu rồi và tôi không nhớ. nếu tôi tìm thấy mã này, tôi sẽ sửa câu hỏi, nếu không bạn đã kiểm tra nó, hãy cho tôi biết những phát hiện của bạn. –

+0

Tôi đã thực hiện một cái gì đó như thế này với các loại phù hợp cho tài sản phụ thuộc và bản thân tài sản; tuy nhiên, đáng ngạc nhiên, nó vẫn hoạt động nếu tôi thay thế IEnumerable thay cho Object trong DepedencyProperty.Register. Không chắc chắn những gì để làm cho rằng ... – dtm

Trả lời

6

Tạo đối tượng có thuộc tính phụ thuộc loại đối tượng, đặt liên kết với đường dẫn thuộc tính làm đường dẫn và đối tượng tùy ý làm nguồn. ràng buộc sẽ thực thi và bạn có thể thấy cái gì (nếu có) ở cuối đường dẫn đặc tính. Đây là cách duy nhất tôi đã tìm thấy để làm điều này loại trong mã. bạn có thể viết một công cụ phản xạ đệ quy có thể đi theo một đường dẫn đặc tính, nhưng nó đã được thực hiện, chúng ta sử dụng nó khi chúng ta liên kết. mất năm phút để viết :)

+0

Cảm ơn, điều này làm việc, thêm mã kết quả cho câu hỏi. –

+1

i sử dụng nó trong trường hợp kỳ lạ, tôi tự hỏi về hiệu suất, nhưng wpf sử dụng ràng buộc trên tất cả các nơi để whats khác ... –

+1

WPF có thể có bộ nhớ đệm tại chỗ, trong khi mã ở dạng hiện tại không. Ít nhất bộ nhớ đệm các ràng buộc giữa nhiều cuộc gọi về mặt lý thuyết có thể được tốt hơn, nhưng tôi không quan tâm đủ để xác minh, trừ khi tôi nhận thấy sự chậm lại. :) –

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