Страницы

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

понедельник, 24 февраля 2020 г.

Binding color to constants class

#c_sharp #wpf #binding #color #const


Не могу прибиндить цветовую константу, которая находится в другой dll-ке.

"/>


Студия ругается на плохой код и  не хочет ничего делать. И принимает только объект,
а стринг не хочет. Как я понял, нужен конвертер.

Есть ли стандартный, или самому писать? (если можно, пример).
    


Ответы

Ответ 1



Ссылки на статические свойства нужно давать не через 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").

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

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