|
|
Converter Bool -> Pfad
Letzter Beitrag 21. Sep 2010 8:34 von Jan Welker. 5 Antworten.
-
02. Sep 2010 17:25
|
|
-
MikeJ



- Registriert am 01. Sep 2010
- Sulzbach am Main
- Beiträge 3
- Punkte 60
|
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 ClassDie 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
|
|
-
-
akk


- Registriert am 24. Nov 2009
- Beiträge 49
- Punkte 725
|
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).
|
|
-
-
MikeJ



- Registriert am 01. Sep 2010
- Sulzbach am Main
- Beiträge 3
- Punkte 60
|
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
|
|
-
-
akk


- Registriert am 24. Nov 2009
- Beiträge 49
- Punkte 725
|
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
|
|
-
-
Seite 1 von 1 (6 Treffer)
|
|