Ist es möglich, einen Typkonverter für eine statische Ressource in WPF zu liefern?
-
24-09-2019 - |
Frage
Ich habe eine Neuling WPF -Frage.
Stellen Sie sich vor, meine Benutzersteuerung hat eine Namespace -Deklaration wie folgt:
xmlns:system="clr-namespace:System;assembly=mscorlib"
Und ich habe Ressourcen für die Benutzerkontrolle wie diese:
<UserControl.Resources>
<system:Int32 x:Key="Today">32</system:Int32>
</UserControl.Resources>
Und dann habe ich irgendwo in meiner Benutzerkontrolle Folgendes:
<TextBlock Text="{StaticResource Today}"/>
Dies führt zu einem Fehler, weil Today
wird als Ganzzahlressource definiert, aber die Texteigenschaft erwartet eine Zeichenfolge. Dieses Beispiel wird erfunden, zeigt aber hoffentlich die Frage.
Die Frage ist, dass ich meinen Ressourcentyp genau mit dem Eigenschaftstyp übereinstimmen kann. Gibt es eine Möglichkeit für mich, einen Konverter für meine Ressourcen bereitzustellen? So etwas wie Ivalueconverter für Bindungen oder einen Typkonverter.
Vielen Dank!
Lösung
Es ist möglich, wenn Sie eine Bindung verwenden. Es scheint ein bisschen seltsam, aber das wird tatsächlich funktionieren:
<TextBlock Text="{Binding Source={StaticResource Today}}" />
Dies liegt daran, dass die Bindungsmotor für die Grundtypen eingebaute Typumwandlungen enthält. Wenn Sie die Bindung verwenden, können Sie Ihre eigenen angeben, wenn ein integrierter Konverter nicht vorhanden ist.
Andere Tipps
ABes Antwort sollte in den meisten Situationen funktionieren. Eine andere Option wäre, die zu erweitern StaticResourceExtension
Klasse :
public class MyStaticResourceExtension : StaticResourceExtension
{
public IValueConverter Converter { get; set; }
public object ConverterParameter { get; set; }
public MyStaticResourceExtension()
{
}
public MyStaticResourceExtension(object resourceKey)
: base(resourceKey)
{
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
object value = base.ProvideValue(serviceProvider);
if (Converter != null)
{
Type targetType = typeof(object);
IProvideValueTarget target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (target != null)
{
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;
}
}
}
value = Converter.Convert(value, targetType, ConverterParameter, CultureInfo.CurrentCulture);
}
return value;
}
}