Closed derekantrican closed 7 months ago
As workaround, try add this code before use triggers somewhere in applications initialization:
if (!TypeDescriptor.GetAttributes(typeof(Avalonia.Thickness)).Cast<Attribute>().Any(x => x is TypeConverterAttribute))
{
TypeDescriptor.AddAttributes(typeof(Avalonia.Thickness), new TypeConverterAttribute(typeof(ThicknessTypeConverter)));
}
/*...*/
public class ThicknessTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
{
return sourceType == typeof(string) || sourceType == typeof(double) || sourceType == typeof(int);
}
public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
{
return value switch
{
string stringValue => new Avalonia.Thickness(double.Parse(stringValue, culture)),
double doubleValue => new Avalonia.Thickness(doubleValue),
int intValue => new Avalonia.Thickness(intValue),
_ => base.ConvertFrom(context, culture, value)
};
}
}
ChangePropertyAction
internally uses a heuristic way of converting types (e.g. string
->Avalonia.Thickness
and string
->Avalonia.Brush
in your case) and it falldown to call TypeDescriptor.GetConverter
. Using reflection it tries to find custom TypeConverter
for destynation type. There is no default converter today, but you can do it yourself.
Same problem but with padding:
<i:Interaction.Behaviors>
<ia:DataTriggerBehavior Binding="{Binding IsExpanded}" ComparisonCondition="Equal" Value="true">
<ia:ChangePropertyAction TargetObject="{Binding #btn}" PropertyName="Content" Value=""/>
<ia:ChangePropertyAction TargetObject="{Binding #btn}" PropertyName="Padding" Value="5,7,5,3"/>
</ia:DataTriggerBehavior>
<ia:DataTriggerBehavior Binding="{Binding IsExpanded}" ComparisonCondition="Equal" Value="false">
<ia:ChangePropertyAction TargetObject="{Binding #btn}" PropertyName="Padding" Value="9,4,1,6"/>
<ia:ChangePropertyAction TargetObject="{Binding #btn}" PropertyName="Content" Value=""/>
</ia:DataTriggerBehavior>
</i:Interaction.Behaviors>
When trying to implement the suggested workaround I can cannot find class Avalonia.Padding
. Seems like it would be a pretty low leve object and included in the Avalonia library(?):
public class PaddingTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
{
return sourceType == typeof(string) || sourceType == typeof(double) || sourceType == typeof(int);
}
public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
{
return value switch
{
string stringValue => new Avalonia.Padding(double.Parse(stringValue, culture)), // error: .Padding(...) not found
};
}
}
Instead, it should be parsed compile time. But for that some attributes-hints should be created.
I'm on version 0.9.12 of everything. I'm trying to do the following:
That doesn't seem to work, but - as an alternate test, this does work: