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!

War es hilfreich?

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;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top