.
Anmeldung | Registrieren | Hilfe
in Suchen

Converter Bool -> Pfad

Letzter Beitrag 21. Sep 2010 8:34 von Jan Welker. 5 Antworten.
Seite 1 von 1 (6 Treffer)
Beiträge sortieren: Zurück Weiter
  • 02. Sep 2010 17:25

    • MikeJ
    • Top 500 Mitwirkender
      Männlich
    • Registriert am 01. Sep 2010
    • Sulzbach am Main
    • Beiträge 3
    • Punkte 60

    Converter Bool -> Pfad

    Hallo zusammen

    ich scheitere seit einigen Tagen an einem Converter, welcher mir einen Bool in einen Pfad Wandeln, und in einem Listview anzeigen soll:
    <ValueConversion(GetType(Boolean), GetType(Geometry))>
    Class cvBoolCheck
        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 CBool(value) = True Then
                Return CType(Application.Current.FindResource("OKSign"), Path)
            Else
                Return Nothing
            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
            'nicht implementiert
            Return False
        End Function
    
    End Class

    Die Resource schaut so aus:
    <Path x:Key="OKSign" Margin="0" SnapsToDevicePixels="false" Stretch="Fill" StrokeLineJoin="Round" Stroke="#FF13DF13" Data="F1 M 0.75,23.25L 17.1667,39.25L 39.125,3L 28.9375,0.770832L 15.1875,28.6458L 4,16.4583L 0.75,23.25 Z ">
                   <Path.Fill>
                    <LinearGradientBrush StartPoint="-0.0130293,0.5" EndPoint="1.01303,0.5">
                        <LinearGradientBrush.GradientStops>
                            <GradientStop Color="#FF14EB14" Offset="0"/>
                            <GradientStop Color="#FF32B032" Offset="1"/>
                        </LinearGradientBrush.GradientStops>
                    </LinearGradientBrush>
                </Path.Fill>
            </Path>


    Aber Statt den Pfad in der ListView anzuzeigen erscheint dort nur 'System.Windows.Shapes.Path'

    Kann mir dabei jemand helfen?!

    Vielen Dank und viele Grüße
    Mike
    • IP-Adresse ist Registriert
  • 03. Sep 2010 18:09 Antwort zu

    • akk
    • Top 50 Mitwirkender
    • Registriert am 24. Nov 2009
    • Beiträge 49
    • Punkte 725

    Converter Bool -> Pfad

    bei den Angaben kann ich nur raten:
    Die Verwendung einer ListView deutet darauf hin, daß mehrere Datensätze angezeigt werden sollen. Schätzungsweise gab es den Fehler
      {"Bei dem angegebenen Element handelt es sich bereits um das logische untergeordnete Element eines anderen Elements. Führen Sie zuerst eine Trennung durch."}
    als das Path-Objekt in den Content einer Content-Klasse o.ä. per Binding gesetzt werden sollte und, um die Exception zu vermeiden, wird an eine Property gebunden, die einen String erwartet (z.B. TextBlock.Text). Und genau da liegt das Problem: Bindings an DependencyProperties vom Type String erhalten nicht das eigentliche Object (in obigen Fall vom Type Path), sondern Object.ToString().
    Die Fehlermeldung besagt, daß ein logisch untergeordnetes Objekt (Visual, Visual3D und deren abgeleitete Klassen) nur ein einziges Mal in einer Ansicht stecken kann. Der Konverter gibt aber stets dieselbe Instanz zurück mit dem Ergebnis, daß spätestens bei der 2. Binding eine Exception geworfen wird.
    Abhilfe: den geringsten Aufwand hat man, wenn der Converter immer ein neues (und damit unbenutztes) Path-Objekt zurückgibt, die verglichen mit dem Original dieselben Property-Werte hat.


    <ValueConversion(GetType(Boolean), GetType(Geometry))>
    Public Class cvBoolCheck
       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 CBool(value) = True Then
             Dim pathOriginal As Path = CType(Application.Current.FindResource("path"), Path)
             Dim RetVal As New Path()
             Dim pis As System.Reflection.PropertyInfo() = GetType(Path).GetProperties()
    
    
             'Kopie der Properties
             For Each pi As System.Reflection.PropertyInfo In pis
                If pi.CanRead AndAlso pi.CanWrite Then
                   pi.SetValue(RetVal, pi.GetValue(pathOriginal, New Object() {}), New Object() {})
                End If
             Next
             Return RetVal
          Else
             Return Nothing
          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
          'nicht implementiert
          Return False
       End Function
    
    
    End Class

    Im ItemsTemplate der ListView ist dann wieder ein ContentControl zu setzten mit einer Binding an Content.

    Alternativ könnte im ItemsTemplate direkt ein Path-Objekt eingebaut werden und deren Visibility gebunden werden (der Converter müßte in diesem Fall nur Boolean nach Visibility konvertieren).

    • IP-Adresse ist Registriert
  • 06. Sep 2010 18:47 Antwort zu

    • MikeJ
    • Top 500 Mitwirkender
      Männlich
    • Registriert am 01. Sep 2010
    • Sulzbach am Main
    • Beiträge 3
    • Punkte 60

    Converter Bool -> Pfad

    Hi,

    so ganz verstanden habe ich das jetzt nicht.
    Also:
    -Ja, das ListView setze ich ein, da mehrere Zeilen (mit mehreren Spalten) mit Daten angezeigt werden sollen.
    -Einen Fehler direkt gab es ja nicht. Nur statt meiner Grafik stand halt dieser Text in der Spalte

    Eingebunden habe ich die Converter so:
    <ListView x:Name="lvHeftpunkte" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" Grid.Column="2" Margin="0,31,0,0" Width="350" SelectionChanged="lvHeftpunkte_SelectionChanged">
                                    <ListView.View>
                                        <GridView>
                                            <GridViewColumn DisplayMemberBinding="{Binding Name}">
                                                <GridViewColumnHeader Content="Name"/>
                                            </GridViewColumn>
                                            <GridViewColumn DisplayMemberBinding="{Binding X_Maß}">
                                                <GridViewColumnHeader Content="X-Maß"/>
                                            </GridViewColumn>
                                            <GridViewColumn DisplayMemberBinding="{Binding Z_Maß}">
                                                <GridViewColumnHeader Content="Z-Maß"/>
                                            </GridViewColumn>
                                            <GridViewColumn DisplayMemberBinding="{Binding Vorderseite, Converter={StaticResource cvBoolCheck}}">
                                                <GridViewColumnHeader Content="Seite"/>
                                            </GridViewColumn>
                                            <GridViewColumn DisplayMemberBinding="{Binding Reihenfolge, Converter={StaticResource cvVerwendung}}">
                                                <GridViewColumnHeader Content="Verwendet"/>
                                            </GridViewColumn>
                                        </GridView>
                                    </ListView.View>
                                </ListView>

    im VB-Code schaut´s dann so aus:
    Private dvHeftpunkte As DataView
    ...
    lvHeftpunkte.DataContext = dvHeftpunkte


    Oder hast Du das anders gemeint?

    Viele Grüße
    Mike
    • IP-Adresse ist Registriert
  • 06. Sep 2010 21:38 Antwort zu

    • akk
    • Top 50 Mitwirkender
    • Registriert am 24. Nov 2009
    • Beiträge 49
    • Punkte 725

    Converter Bool -> Pfad

    Sorry, wußte nicht, daß Du eine GridView bemüht hast.
    In nachstehender MainWindow.xaml-Datei sind zwei Möglichkeiten aufgezeigt, wie ein Path-Objekt innerhalb eines GridViewColumns eingetragen werden kann. Als Datenquelle dient eine statische Auflistung von Boolschen Werten (StaticResource myArr).
    Die erste Spalte verwendet das DataTemplate cellTemplate1; hier wird je nach dem Boolschen Wert über einen Converter direkt eine Path-Instanz zurückgegeben. Die 2. Spalte zeigt den Wert direkt an (allerdings als String).
    In der dritten Spalte kommt das DataTemplate cellTemplate2 zum Einsatz, das das Path-Objekt direkt im DataTemplate definiert hat. Hier erfolgt das Schalten über die Bindung an die Visibility-Eigenschaft.

    <Window x:Class="MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication1"
            xmlns:system="clr-namespace:System;assembly=mscorlib"
            Title="MainWindow" Height="350" Width="525">
       <Window.Resources>
          </local:BooleanToVisibilityConverter x:Key="b2v">
          <local:cvBoolCheck x:Key="cvBool" />
          <x:ArrayExtension Type="system:Boolean" x:Key="myArr">
             <system:Boolean>True</system:Boolean>
             <system:Boolean>False</system:Boolean>
             <system:Boolean>True</system:Boolean>
             <system:Boolean>True</system:Boolean>
             <system:Boolean>False</system:Boolean>
          </x:ArrayExtension>
          <DataTemplate x:Key="cellTemplate1">
             </ContentControl Content="{Binding Converter={StaticResource ResourceKey=cvBool}}">
          </DataTemplate>
          <DataTemplate x:Key="cellTemplate2">
             <Path Visibility="{Binding Converter={StaticResource ResourceKey=b2v}}" Margin="0" SnapsToDevicePixels="false" Stretch="Fill" StrokeLineJoin="Round" Stroke="#FF13DF13" Data="F1 M 0.75,23.25L 17.1667,39.25L 39.125,3L 28.9375,0.770832L 15.1875,28.6458L 4,16.4583L 0.75,23.25 Z ">
                <Path.Fill>
                   <LinearGradientBrush StartPoint="-0.0130293,0.5" EndPoint="1.01303,0.5">
                      <LinearGradientBrush.GradientStops>
                         <GradientStop Color="#FF14EB14" Offset="0"/>
                         <GradientStop Color="#FF32B032" Offset="1"/>
                      </LinearGradientBrush.GradientStops>
                   </LinearGradientBrush>
                </Path.Fill>
             </Path>
          </DataTemplate>
       </Window.Resources>
       <StackPanel>
          <ListView ItemsSource="{StaticResource ResourceKey=myArr}">
             <ListView.View>
                <GridView>
                   </GridViewColumn CellTemplate="{StaticResource ResourceKey=cellTemplate1}">
                   </GridViewColumn DisplayMemberBinding="{Binding}">
                   </GridViewColumn CellTemplate="{StaticResource ResourceKey=cellTemplate2}">
                </GridView>
             </ListView.View>
          </ListView>
       </StackPanel>
    </Window>


    Der Vollständigkeit halber die beiden Converter:

    Public Class BooleanToVisibilityConverter
       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
          Try
             If CBool(value) Then
                Return Visibility.Visible
             Else
                Return Visibility.Collapsed
             End If
          Catch
             Return Visibility.Collapsed
          End Try
       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
          Return TypeOf value Is Visibility AndAlso CType(value, Visibility) = Visibility.Visible
       End Function
    End Class
    
    
    <ValueConversion(GetType(Boolean), GetType(Geometry))>
    Public Class cvBoolCheck
       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 CBool(value) = True Then
             Dim pathOriginal As Path = CType(Application.Current.FindResource("path"), Path)
             Dim RetVal As New Path()
             Dim pis As System.Reflection.PropertyInfo() = GetType(Path).GetProperties()
    
    
             'Kopie der Properties
             For Each pi As System.Reflection.PropertyInfo In pis
                If pi.CanRead AndAlso pi.CanWrite Then
                   pi.SetValue(RetVal, pi.GetValue(pathOriginal, New Object() {}), New Object() {})
                End If
             Next
             Return RetVal
          Else
             Return Nothing
          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
          'nicht implementiert
          Return False
       End Function
    End Class

    • IP-Adresse ist Registriert
  • 20. Sep 2010 7:50 Antwort zu

    • MikeJ
    • Top 500 Mitwirkender
      Männlich
    • Registriert am 01. Sep 2010
    • Sulzbach am Main
    • Beiträge 3
    • Punkte 60

    Converter Bool -> Pfad

    hi,

    vielen Dank für die Antworten, bin leider noch nicht zum Testen gekommen und wollte mich daher nur mal kurz zwischendurch melden. Ich sag auf jeden Fall nochmal Bescheid wenn ich zum Testen gekommen bin.

    PS:  was muss ich denn hier machen, dass die Email-Benachrichtigung bei neuen Antworten funktioniert?! Und hier im Textfeld erscheint kein Corsor - ist das normal oder hab nur ich das Problem? (Zumindest beim Firefox, beim IE kann ich den Cursor sehen)

    Viele Grüße
    Mike
    • IP-Adresse ist Registriert
  • 21. Sep 2010 8:34 Antwort zu

    • Jan Welker
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 13. Jan 2008
    • 90491
    • Beiträge 1.455
    • Punkte 20.165
    • Moderator

    Converter Bool -> Pfad

    Hallo,
    um Emails zu empfangen gehe mal oben rechts auf Profil bearbeiten, dann im Tab Email kannst du alles einstellen.

    Der Cursor ist im Firefox manchmal weg, hab ich auch schon gesehen. Das beobachte ich mal.
    Jan


    • IP-Adresse ist Registriert
Seite 1 von 1 (6 Treffer)

WPF Forum | ASP.NET Forum | ASP.NET MVC Forum | Silverlight Forum | Windows Phone 7 Forum | SharePoint Forum | Dotnet Jobs | Dotnet Termine | Developer Blogs | Dotnet News

Das Team | Regeln | Impressum