0

Silverlight 5 のマークアップ拡張機能でこのコードを試しています。

 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 型ではないようです (型は System.Reflection.PropertyInfo の System.String です)。キャストの結果は null になります。

depProp は正しい Text または Content プロパティを表していますが、それが DependencyProperty でないと値を設定できません。

任意の入力をいただければ幸いです。

シコ

4

2 に答える 2

0

上記の@Berrylのアプローチはうまくいく可能性があります。ただし、 にもアクセスする必要がある場合はDependencyProperty、次のようなものを使用できます。このコードは、Silverlight と WPF の微妙な違いも示していますが、どちらもうまく機能します。

#elseSilverlight または WPF のみの場合、コードを少し簡略化するためにの前後の部分を削除できます。

ただし、依存関係プロパティを解決する部分は途中 (代入_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;
        }
    }
于 2013-04-30T10:26:22.047 に答える
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);
}
于 2012-08-01T16:17:32.933 に答える