我正在 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 (类型为 Sytem.String (of System.Reflection.PropertyInfo))。强制转换结果为空。
depProp 表示正确的文本或内容属性,但不是 依赖属性 I 无法设置其值。
任何意见都非常感谢。
西科
不知道为什么它会出现为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);
}
给出的方法@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;
}
}