#c# #.net #wpf #xaml
#c# #.net #wpf #xaml
Вопрос:
Я заметил, что из преобразователя значений можно возвращать строку типа «Видимая», «Свернутая», «Изображения / xyz.png» или «#FFB3D1», и магия привязок позволяет это вычислить. Скройте / покажите элемент пользовательского интерфейса, найдите изображение в формате xyz.png или покрасьте во что-нибудь розовое…
Я долгое время принимал это как должное, теперь это не работает с моим последним кодом, поэтому мой вопрос в том, как я могу вручную вызвать эту функциональность?
Объяснение:
Я расширил масштаб, создав пользовательскую MarkupExtension, которая подключает мультиконвертер, присоединяет его к MultiBinding и возвращает инициализированную привязку. Однако, когда этот мультиконвертер возвращает строки типа «#FFB3D1» или «Red», кажется, ничего не происходит.
// PseudoCode from my MarkupExtension, setting up amp; returning the binding/multi-converter
public override object ProvideValue( IServiceProvider serviceProvider )
{
MultiBinding outputBinding = new MultiBinding();
foreach ( Binding b in bindings )
{
outputBinding.Bindings.Add( b );
}
outputBinding.Converter = converter;
return outputBinding.ProvideValue( serviceProvider );
}
Я предполагаю, что, поскольку я создаю Multibinding Converter в коде, он пропускает шаг где-то в Binding.Magic
пространстве имен.
Решение:
public override object ProvideValue( IServiceProvider serviceProvider )
{
// get targets
IProvideValueTarget serv = (IProvideValueTarget)serviceProvider.GetService( typeof( IProvideValueTarget ) );
// get Type Converter
object[] typeConverterAttributes = ( (DependencyProperty)serv.TargetProperty ).PropertyType.GetCustomAttributes( typeof( TypeConverterAttribute ), true );
TypeConverter typeConverter = null;
if ( typeConverterAttributes.Length > 0 )
{
TypeConverterAttribute attr = (TypeConverterAttribute)typeConverterAttributes[0];
typeConverter = (TypeConverter)Activator.CreateInstance( Type.GetType( attr.ConverterTypeName ), false );
}
Тогда это просто случай применения преобразования типов вручную
Комментарии:
1. Атрибут TypeConverter также может быть объявлен в типе свойства, например, в самом классе Brush. Возможно, вы захотите, чтобы ваш код проверял и там.
Ответ №1:
Волшебство, на которое вы ссылаетесь, связано с использованием в фреймворке TypeConverter
атрибута.
Если это ваше собственное свойство, к которому вы привязываетесь, возможно, вам следует определить новый TypeConverter и украсить свойство атрибутом TypeConverter.
Ответ №2:
Может быть, вы можете попробовать BrushConverter.