Не могу прибиндить цветовую константу, которая находится в другой dll-ке.
Студия ругается на плохой код и не хочет ничего делать. И принимает только объект, а стринг не хочет. Как я понял, нужен конвертер.
Есть ли стандартный, или самому писать? (если можно, пример).
Ответ
Ссылки на статические свойства нужно давать не через Binding, а через x:Static
При этом у вас, разумеется, должно быть правильно объявлено пространство имён constants, что-то вроде
xmlns:constants="clr-namespace:Namespace.In.Assembly;assembly=Your.Assembly.Name"
Не забудьте убедиться, что ваша сборка с константами называется Your.Assembly.Name, в ней в пространстве имён Namespace.In.Assembly находится public-класс ColorConstants, у которого есть статическое свойство (а не поле!) Black, у которого хотя бы getter объявлен как public
Для случая, когда ваш x:Static обладает неправильным типом (у вас строка, а ожидается Color), вам нужно применить конвертер. Самый простой синтаксически способ — написать свой MarkupExtension в замену x:Static, который заодно конвертировал бы значение в нужный тип стандартным конвертером.
Итак:
public class SmartStaticExtension : StaticExtension
{
public SmartStaticExtension(string member) : base(member)
{
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
// получим значение стандартного x:Static
object value = base.ProvideValue(serviceProvider);
// попытаемся вычислить тип, к которому надо привести
IProvideValueTarget target =
serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (target != null)
{
Type targetType = typeof(object);
// если целевое свойство - DependencyProperty
DependencyProperty dp = target.TargetProperty as DependencyProperty;
if (dp != null)
{
targetType = dp.PropertyType; // берём тип у него
}
else
{
// целевое свойство - обыкновенное свойство, используем рефлексию
PropertyInfo pi = target.TargetProperty as PropertyInfo;
if (pi != null)
targetType = pi.PropertyType;
}
// получаем стандартный конвертер:
TypeConverter converter = TypeDescriptor.GetConverter(targetType);
// и конвертируем
value = converter.ConvertFrom(value);
}
return value;
}
}
Имея такой конвертер, можно написать
(разумеется, пространство имён local должно указывать туда, где определён SmartStaticExtension).
Работает как со строками ("LightCyan") так и с RGB-константами ("#708090").
Комментариев нет:
Отправить комментарий