Страницы

Поиск по вопросам

вторник, 7 мая 2019 г.

Binding color to constants class

Не могу прибиндить цветовую константу, которая находится в другой 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").

Комментариев нет:

Отправить комментарий