Как обновить целевой объект из расширения разметки в SL5?
Я пытаюсь этот код в расширении разметки в 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 (из System.Reflection.PropertyInfo)). Приведение приводит к нулю.
depProp представляет нужное свойство Text или Content, но без его свойства DependencyProperty я не могу установить его значение.
Любой вклад с благодарностью.
SIKO
2 ответа
Не уверен, почему он подходит как 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;
}
}