2010-03-04 4 views
10

Ich habe eine neue WPF-Frage.Kann in WPF ein Typkonverter für eine statische Ressource bereitgestellt werden?

mein Benutzerkontrolle Imagine hat einen Namespace-Deklaration wie folgt aus:

xmlns:system="clr-namespace:System;assembly=mscorlib" 

Und ich habe Ressourcen für die Benutzersteuerung wie folgt aus:

<UserControl.Resources> 
    <system:Int32 x:Key="Today">32</system:Int32> 
</UserControl.Resources> 

Und dann irgendwo in meinem Benutzersteuer ich diese haben :

<TextBlock Text="{StaticResource Today}"/> 

Dies führt zu einem Fehler, da Today als Ganzzahlressource definiert ist, die Text-Eigenschaft jedoch eine Zeichenfolge erwartet. Dieses Beispiel ist erfunden, illustriert aber hoffentlich die Frage.

Die Frage ist, kann ich meinen Ressourcentyp nicht genau mit dem Eigenschaftstyp vergleichen, gibt es eine Möglichkeit für mich, einen Konverter für meine Ressourcen bereitzustellen? So etwas wie IValueConverter für Bindings oder einen Typkonverter.

Vielen Dank!

Antwort

23

Es ist möglich, wenn Sie eine Bindung verwenden. Es scheint ein wenig seltsam, aber das wird tatsächlich funktionieren:

<TextBlock Text="{Binding Source={StaticResource Today}}" /> 

Es ist, weil die Bindungsmodul Typumwandlung für die Grundtypen-in gebaut hat. Wenn ein eingebauter Konverter nicht vorhanden ist, können Sie auch mithilfe der Bindung eigene angeben.

+1

Perfekt, danke für die Information! – Notre

+0

Was wäre, wenn Sie die Farbkomponenten von einer StatistikResource erhalten möchten, bei der es sich um eine Farbe handelt? (Zum Beispiel, um die Opazität der StaticResource-Farbe zu ändern.) Folgendes scheint nicht zu funktionieren:

+1

Es funktioniert nicht, da Sie nur eine Bindung für a festlegen können DependencyProperty eines DependencyObject. Farbe ist eine Struktur. Sie könnten ein eigenes Farbwrapper-Objekt erstellen, das eine DependencyProperty ist, und die Eigenschaften A, R, G, B und Farbe anzeigen, die selbst DPs sind. Wenn Sie eine der Eigenschaften ändern, wird die Color-Eigenschaft aktualisiert, und wenn Sie sie ändern, werden alle anderen aktualisiert. –

4

Abes Antwort sollte in den meisten Situationen funktionieren. Eine andere Option wäre, die StaticResourceExtension Klasse zu erweitern:

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; 
    } 
} 
+0

Oh! Das ist auch interessant. Danke Thomas! – Notre

Verwandte Themen