2012-04-19 92 views
0

我在Silverlight嘗試這種代碼標記擴展5.如何從SL5中的標記擴展更新目標對象?

public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     _target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); 
     _depObj = _target.TargetObject as DependencyObject; 
     _depProp = _target.TargetProperty as DependencyProperty; 

     return GetText(TextId, DefaultText); 
    } 

depObj似乎是正確提供,但depProp似乎不是 類型的DependencyProperty(類型爲Sytem.String(系統.Reflection.PropertyInfo))。演員結果爲空。

depProp代表正確的文本或內容屬性,但沒有它是 DependencyProperty我無法設置它的值。

任何輸入非常感謝。

SIKO

回答

0

不知道爲什麼它來了作爲一個的PropertyInfo,但你當然可以設定代碼類似的值:

if (TargetProperty is DependencyProperty) 
{ 
    var dependencyObject = target as DependencyObject; 
    if (dependencyObject != null) 
    { 
     var newValue = GetValue(); 
     dependencyObject.SetValue(TargetProperty as DependencyProperty, newValue); 
    } 
} 
else if (TargetProperty is PropertyInfo) 
{ 
    var pi = target as PropertyInfo; 
    pi.SetValue(target, GetValue(), null); 
} 
+0

我不想挑剔,但c#是類型安全的,如果你是**和**作爲**你一遍又一遍地重複着你。您最好將**作爲**結果存儲在局部變量中,並執行更快的空檢查。 **是**操作的結果是yes或no,而** as操作的結果爲null或成功投射。也不會拋出異常。 – 2013-04-30 10:04:11

0

的方法@Berryl上面給了可以工作。但是如果你還需要到DependencyProperty,你可以使用這樣的東西。這段代碼也演示了silverlight和WPF之間的細微差別,但兩者都可以很好地工作。

僅適用於Silverlight或WPF,您可以刪除#else之前或之後的部分,以簡化代碼。

但是,解析依賴項屬性的部分位於中間(分配_property)。

public override object ProvideValue(IServiceProvider serviceProvider) 
{ 
    IProvideValueTarget Target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; 

    if (Target == null) { 
     throw new InvalidOperationException(
      "Cannot resolve the IProvideValueTarget. Are you binding to a property?"); 
    } 

    /* we need the dependency property (for bindings) */ 
#if SILVERLIGHT 
    PropertyInfo Property = (PropertyInfo)Target.TargetProperty; 

    /* resolve the dependency property */ 
    FieldInfo DepPropertyInfo = Target.TargetObject.GetType() 
     .GetField(Property.Name + "Property", BindingFlags.Static | BindingFlags.Public); 

    _property = (DependencyProperty)DepPropertyInfo.GetValue(/* obj = */ null); 
#else 
    _property = Target.TargetProperty as DependencyProperty; 
#endif 

    if (_property != null) { 
#if SILVERLIGHT 
     if (Property.Name.StartsWith("Text")) { 
      UpdateSourceTrigger = UpdateSourceTrigger.Default; 
#else 
     if (_property.Name.StartsWith("Text")) { 
      UpdateSourceTrigger = UpdateSourceTrigger.LostFocus; 
#endif 
     } 
     else { 
      UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
     } 
    }