ich eine Markupextension so zu schreiben bin versucht:Kann ein Typeconverter für Konstruktorargument verwendet werden
<Label Content="{units:Length 1 mm}" />
Errs mit:
[MarkupExtensionReturnType(typeof(Length))] public class LengthExtension : MarkupExtension { // adding the attribute like this compiles but does nothing. public LengthExtension([TypeConverter(typeof(LengthTypeConverter))]Length value) { this.Value = value; } [ConstructorArgument("value")] public Length Value { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { return this.Value; } }
Um wie folgt verwendet werden
Der TypeConverter für den Typ "Length" unterstützt keine Konvertierung von String.
Die Typeconverter funktioniert, wenn ich:
- es auf der
Value
Eigenschaft Put und einen Standard Ctor haben. - Dekorieren Sie den Typ
Length
mit dem Attribut.
Während dies x/y sein kann, möchte ich keine dieser Lösungen. Hier
ist der Code für den Konverter:
public class LengthTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(InstanceDescriptor) || destinationType == typeof(string))
{
return true;
}
return base.CanConvertTo(context, destinationType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var text = value as string;
if (text != null)
{
return Length.Parse(text, culture);
}
return base.ConvertFrom(context, culture, value);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (value is Length && destinationType != null)
{
var length = (Length)value;
if (destinationType == typeof(string))
{
return length.ToString(culture);
}
else if (destinationType == typeof(InstanceDescriptor))
{
var factoryMethod = typeof(Length).GetMethod(nameof(Length.FromMetres), BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(double) }, null);
if (factoryMethod != null)
{
var args = new object[] { length.metres };
return new InstanceDescriptor(factoryMethod, args);
}
}
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
Vielen Dank mein Herr, ich scheitere beim googeln. Wissen Sie, wie viel implizite Konvertierung das Attribut auf die Klassendefinition anwendet? Vielleicht ist das eine andere Frage. Oder vielleicht [chat] (http://chat.stackoverflow.com/rooms/18165/wpf) –
Nicht sicher, was "wie viel implizite Konvertierung" eigentlich bedeutet. Wenn Sie jedoch das Attribut auf den Length-Typ anwenden, findet die Konvertierung immer dann statt, wenn Sie eine Länge in XAML festlegen. – Clemens
Stellt sich heraus, Bindungen verwendet es auch. Vielleicht Sachen wie Serialisierung. Ich bin kein großer Fan von impliziter Konvertierung :) –