2010-02-06 52 views
10

我正在寫一個自定義控件,我有一個屬性路徑作爲字符串(想想comboBox.SelectedValuePath)。
代碼中爲任意對象評估此字符串的最佳方式是什麼?WPF我應該如何評估屬性路徑?

我明顯可以自己解析它,但它是一個黑客,我想路徑支持一切comboBox.SelectedValuePath(一致性)。

結果(感謝阿蘭穆赫蘭):

不知道關於這樣的表現,但我不爲業績在意現在。

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

是否注意到當Result屬性是類型對象時,Target中DependencyProperty的聲明類型是IEnumerable? – dtm 2013-06-04 23:14:39

+0

@dtm可能只是我的錯誤 - 發佈中間版本而不是最終版本。不過那是很久以前的事了,我不記得了。如果我找到這個代碼,我會糾正這個問題,否則如果你測試了它,請讓我知道你的發現。 – 2013-06-04 23:47:48

+0

我沒有實現類似這樣的依賴項屬性和屬性本身匹配的類型;然而,令人驚訝的是,它仍然有效,如果我用DepedencyProperty.Register中的Object代替IEnumerable。不知道該怎麼做... – dtm 2013-06-05 19:58:17

回答

6

創建具有類型的對象,一個依賴屬性的對象,設置您的屬性路徑的路徑,你作爲源任意對象就可以了綁定。綁定將會執行,您可以看到屬性路徑末尾有什麼(如果有的話)。這是我發現在代碼中做這種事情的唯一方法。你可以編寫一個遞歸反射引擎,它可以遵循屬性路徑,但它已經完成了,我們在綁定時使用它。帶你五分鐘後寫:)

+0

謝謝,這個工程,將結果代碼添加到問題。 – 2010-02-06 12:23:32

+1

我在奇怪的情況下使用它,我對性能感到好奇,但是wpf使用綁定遍佈整個地方,所以另一個... – 2010-02-06 12:28:42

+1

WPF可能有緩存,而當前形式的代碼沒有。至少緩存多個調用之間的綁定在理論上可以更好,但我不關心足夠的驗證,除非我注意到放緩。 :) – 2010-02-06 12:34:59