none
Problem Converter Integer -> String RRS feed

  • Frage

  • Hallo zusammen,

     

    ich bin neu hier im Forum und hatte eigentlich eine englische Sprache erwartet :)

    Nunja zu meinem Problem:

    Ich habe eine XML Datenquelle die ich per XmlDataProvider in XAMl-Code eingebunden haben.
    Die Datenquelle beinhaltet Einstellungen die mit 0 oder 1 dargestellt werden. Also beispielsweise <MySetting>1</MySetting>

    Um dies komfortabel in einer WPF Form darzustellen bietet sich der ToggleButton an.

     

    <ToggleButton IsChecked="{Binding Source={StaticResource MyXmlResource}, XPath=//MySetting, Mode=TwoWay, Converter={StaticResource BinaryToBooleanConverter}}"/>
    
    
    ToggleButton.IsChecked erfordert jedoch einen Boolean-Wert, also bin ich her gegangen und schrieb einen Converter:

     

     

    <ValueConversion(GetType(Integer), GetType(Boolean))> _
    
    Public Class BinaryToBooleanConverter
    
     Implements IValueConverter
    
    
    
     Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
    
      If CInt(value) = 0 Then
    
       Return False
    
      Else
    
       Return True
    
      End If
    
     End Function
    
    
    
     Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
    
      If CBool(value) = False Then
    
       Return 0
    
      Else
    
       Return 1
    
      End If
    
     End Function
    
    End Class
    
    
    
    

     

    Soweit so gut, bis zu dieser Stelle funktioniert alles einwandfrei. Doch ich möchte nicht nur die IsChecked Eigenschaft anzeigen lassen, sondern der Textinhalt soll ja auch dem Anwender entsprechend wiedergegeben werden.
    Ich habe es auf dieselbe Art und weise versucht zu lösen, und kopierte obrigen Converter und veränderte in der Kopie die Typen:

    <ValueConversion(GetType(Integer), GetType(String))> _
    
    Public Class BinaryToVisibilityBooleanConverter
    
     Implements IValueConverter
    
    
    
     Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
    
      If CInt(value) = 0 Then
    
       Return "Deaktiviert"
    
      Else
    
       Return "Aktiviert"
    
      End If
    
     End Function
    
    
    
     Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
    
      If value.ToString = "Deaktiviert" Then
    
       Return 0
    
      Else
    
       Return 1
    
      End If
    
     End Function
    
    End Class
    
    
    Und die ToggleButton.Content Eigenschaft:
    Content="{Binding Source={StaticResource MyXmlSource}, XPath=//MySetting, Mode=OneWay, Converter={StaticResource BinaryToVisibilityBooleanConverter}}"
    
    
    Sollte ja theoretisch genauso funktionieren wie der erste Converter, aber es trat ein Fehler auf. as Debugging zeigte dann, dass in der Function Convert das Objekt value kein String ist, sondern ein Xml.XmlElement. Logischerweise meldet dann CInt() einen Cast-Error.
    Folglich habe ich mal versucht im Binding den XPath=//MySetting/text() zu setzen. Dies übergab dann in die Convert Funktion einen Xml.XmlText Datentyp.
    Ich könnte natürlich nun durch TryCatch und entsprechenden Cast Methoden zu meinem Ziel kommen, aber ich verstehe nicht wieso zwei nahezu identische FConverter total unterschiedlich reagieren.

     

    <ValueConversion(GetType(Integer), GetType(String))>
    
    

    Gibt ja den Eingangstyp und den Ausgangstyp an. Ich hätte verstanden wenn value vom Typ String wäre, dann dies ist immernoch ein elementarer Datentyp aber statt wie oben genannt ein integer wird ein Referenztyp (Xml.XmlElement) übergeben?

    Ich würd mich über jede mögliche Antwort freuen :)

    Gruß
    Matthias


    Freitag, 1. Juli 2011 06:48

Antworten

  • Evtl. gibt das TwoWay Binding einen falschen DatenTyp zurück.

    Hier mal ein paar Ansätze:

    - Setze testweise mal das Binding auf OneWay.
    - Überprüfe den DatenTyp der bei "Convert" übergeben wird. Genau diesen musst du dann auch wieder in ConvertBack zurückgeben.



    Freitag, 1. Juli 2011 08:27
    Beantworter


  • ... einige Tests später...

    ich glaub ich habs verstanden.
    Wenn ich eine TextBox oder textBlock nutze, z.B.

    <TextBlock  Text="{Binding Source={StaticResource MyXmlResource}, 	XPath=//MySetting, Mode=OneWay, Converter={StaticResource BinaryToVisibilityBooleanConverter}}" />
    
    
    dann funktioniert der oben genannte Converter einwandfrei. An die Convert Methode wird ein String-Typ übergeben, dieser kann in Integer gecastet werden und liefert das richtige ergebnis.
    Offenbar liegt dieses 'Fehlverhalten' an der Content-Eigenschaft. Diese kann ja diverse Objecte enthalten, in diesem Fall wegen des XmlBinding das Xml.Xmlelement. Wenn ich es so mache:
    <ToggleButton IsChecked="{Binding Source={StaticResource engine.ini}, XPath=//setting1, Mode=TwoWay, Converter={StaticResource BinaryToBooleanConverter}}"> <ToggleButton.Content> <TextBlock Text="{Binding Source={StaticResource engine.ini}, XPath=//setting1, Mode=OneWay, Converter={StaticResource BinaryToVisibilityBooleanConverter}}" /> </ToggleButton.Content> </ToggleButton>
    
    
    Funktioniert auch der Converter mit dem String-Value
    Freitag, 1. Juli 2011 10:12

Alle Antworten

  • Kannst du mal dein komplettes XAML für den ToggleButton posten?
    Freitag, 1. Juli 2011 07:02
    Beantworter
  • Klar, gerne.

    <ToggleButton 
    Content="{Binding Source={StaticResource MyXmlResource}, XPath=//MySetting, Mode=OneWay, Converter={StaticResource BinaryToVisibilityBooleanConverter}}" 
    IsChecked="{Binding Source={StaticResource MyXmlResource}, XPath=//MySetting, Mode=TwoWay, Converter={StaticResource BinaryToBooleanConverter}}"/>
    

    Dabei fällt mir grad auf dass ich vergessen habe zu erwähnen, den TwoWay Mode genutzt zu haben.

    Freitag, 1. Juli 2011 07:41
  • Evtl. gibt das TwoWay Binding einen falschen DatenTyp zurück.

    Hier mal ein paar Ansätze:

    - Setze testweise mal das Binding auf OneWay.
    - Überprüfe den DatenTyp der bei "Convert" übergeben wird. Genau diesen musst du dann auch wieder in ConvertBack zurückgeben.



    Freitag, 1. Juli 2011 08:27
    Beantworter


  • ... einige Tests später...

    ich glaub ich habs verstanden.
    Wenn ich eine TextBox oder textBlock nutze, z.B.

    <TextBlock  Text="{Binding Source={StaticResource MyXmlResource}, 	XPath=//MySetting, Mode=OneWay, Converter={StaticResource BinaryToVisibilityBooleanConverter}}" />
    
    
    dann funktioniert der oben genannte Converter einwandfrei. An die Convert Methode wird ein String-Typ übergeben, dieser kann in Integer gecastet werden und liefert das richtige ergebnis.
    Offenbar liegt dieses 'Fehlverhalten' an der Content-Eigenschaft. Diese kann ja diverse Objecte enthalten, in diesem Fall wegen des XmlBinding das Xml.Xmlelement. Wenn ich es so mache:
    <ToggleButton IsChecked="{Binding Source={StaticResource engine.ini}, XPath=//setting1, Mode=TwoWay, Converter={StaticResource BinaryToBooleanConverter}}"> <ToggleButton.Content> <TextBlock Text="{Binding Source={StaticResource engine.ini}, XPath=//setting1, Mode=OneWay, Converter={StaticResource BinaryToVisibilityBooleanConverter}}" /> </ToggleButton.Content> </ToggleButton>
    
    
    Funktioniert auch der Converter mit dem String-Value
    Freitag, 1. Juli 2011 10:12