2012-01-18 68 views
0

我可能需要的東西一定的幫助,我不能在這一點搞清楚:如何獲得GetBindingExpression目標反射

我需要(通過類不同RESX文件)來更新XAML的綁定在某具有特定名稱前綴的控件的事件。作爲對照有不同的類型,我也沒有知道同一頁面的外觀somewhen在未來,我想做到這一點,只有反思...

var meth1 = control.GetType().GetMethod("GetBindingExpression"); 
var meth2 = control.GetType().GetMethod("SetBinding"); 
BindingExpression be = (BindingExpression)meth1.Invoke(target, null); 
Binding bind = be.ParentBinding; 
meth2.Invoke(target, new object[] { bind }); 

似乎是正確的想法給我,但我無法弄清楚如何從一個DependencyObject的目標的DependencyProperty之前不知道的DependencyObject類型...

我敢肯定,我缺少的東西,而容易在這裏...

我知道我可以通過控件,只需將從ResourceManager對象獲得的新字符串輸入到文本屬性的控制,但在這種情況下,我會再次檢查文本,標題,任何屬性......如果可能的話,反射似乎只是對我來說更乾淨的方式。

+0

爲什麼你不能將控件投射到FrameworkElement並直接使用方法而不是反射? – 2012-01-18 20:02:32

回答

0

您可以簡單地使用下面的方法,

FrameworkElement fe = control as FrameworkElement; 
foreach(PropertyDescriptor pd in TypeDescriptor.GetProperties(control)) 
{ 
    FieldInfo field = control.GetType().GetField(pd.Name + "Property"); 
    if(field == null) 
     continue; 
    DependencyProperty dp = field.GetValue(control) as DependencyProperty; 
    if(dp == null) 
     continue; 
    BindingExpression be = control.GetBindingExpression(dp); 
    if(be == null) 
     continue; 

    // do your stuff here 

} 
+0

謝謝,這讓我回到了正確的方向。由於silverlight不知道TypeDescriptor類,所以上述不起作用,但我按照下面的說明完成了。 – Seb 2012-01-19 09:59:59

0

由於關於投給FrameworkElement的兩個提示,我設法回到正軌:在我認爲會

foreach (var f in control.GetType().GetFields()) 
    { 
     DependencyProperty dp = f.GetValue(control) as DependencyProperty; 
     if (dp != null) 
     { 
      BindingExpression be = ((FrameworkElement)control).GetBindingExpression(dp); 
      if (be != null) 
      { 
       // stuff here 
      } 
     } 
    } 

從這裏完成任務