In Wpf kann man einem Binding einen Konverter mitgeben.
Das wird hier genutzt, um Messwerte in einem Datagrid mit Farbwerten zu hinterlegen - also der Konverter muss aus den Messwerten einen SolidColorBrush "berechnen".
Die Konversion erfolgt natürlich anhand von Schwellwerten - dafür habe ich ja an annerer Stelle das ThresholdDictionary erfunden
Hier, wie es instanziert, mit 8 Farb-Brushes und 7 Schwellwerten "beschickt" wird:
Aber ihr wolltet ja sicherlich den DelegateConverter sehen - wenn das man keine Enttäuschung wird:
Ein Dingsbums, welches IValueConverter implementiert, und 2 DependancyProperties hat - sonst nichts. Getan wird hier eiglich nichts, aber das Ding heißt DelegateConverter, eben weils nix selber tut, sondern die Tätigkeiten delegiert.
Also was es tut ist Konvertieren (mit der Convert()-Methode) und Zurück-Konvertieren (mit der ConvertBack()-Methode - potzblitz!).
Convert() und ConvertBack() sind Bestandteile der IValueConverter-Schnittstelle - vom Framework so vorgegeben.
Einem Binding, was Konvertierung unterstützen soll, kann man ein beliebiges Dingsbums als Converter zuweisen - hauptsache, das Dingsbums implementiert IValueConverter - dann kann das Binding nämlich Convert() und ConvertBack() aufrufen, wenn ihm danach ist
Also nochmal genau DelegateConverter angeguckt: Es gibt die Property Conversion As Func(Of Object, Object), also eine Function, die ein Object entgegennimmt, und ein Object zurückgibt.
Und es gibt den Schnittstellen-Member Convert(), welcher auch ein Object entgegennimmt (und noch 2 weitere Argumente), und ein Object zurückgibt.
Und dieses Convert() tut nix anneres (Zeile#32), als die in Conversion gespeicherte Function aufzurufen, mit value als Argument, und davon das Ergebnis returnen.
Das ViewModel
Hier das bahnbrechende ViewModel, mit all seinen Properties, weil an was anneres als an Properties kann Xaml leider nicht binden:
Wir haben hier 5 Public Properties vorliegen (nicht, dass eine übersehen wird ;)).
Das wird hier genutzt, um Messwerte in einem Datagrid mit Farbwerten zu hinterlegen - also der Konverter muss aus den Messwerten einen SolidColorBrush "berechnen".
Die Konversion erfolgt natürlich anhand von Schwellwerten - dafür habe ich ja an annerer Stelle das ThresholdDictionary erfunden
Hier, wie es instanziert, mit 8 Farb-Brushes und 7 Schwellwerten "beschickt" wird:
Aber ihr wolltet ja sicherlich den DelegateConverter sehen - wenn das man keine Enttäuschung wird:
VB.NET-Quellcode
- Imports System.Globalization
- Namespace System.Windows.Controls
- Public Class DelegateConverter : Inherits DependencyObject : Implements IValueConverter
- Public Shared ReadOnly ConversionProperty As DependencyProperty = New DepProp(Echo(Of Object).Instance, GetType(DelegateConverter), "Conversion")
- Public Property Conversion() As Func(Of Object, Object)
- <DebuggerStepThrough()> _
- Get
- Return DirectCast(GetValue(ConversionProperty), Func(Of Object, Object))
- End Get
- <DebuggerStepThrough()> _
- Set(ByVal NewValue As Func(Of Object, Object))
- SetValue(ConversionProperty, NewValue)
- End Set
- End Property
- Public Shared ReadOnly BackConversionProperty As DependencyProperty = New DepProp(Echo(Of Object).Instance, GetType(DelegateConverter), "BackConversion")
- Public Property BackConversion() As Func(Of Object, Object)
- <DebuggerStepThrough()> _
- Get
- Return DirectCast(GetValue(BackConversionProperty), Func(Of Object, Object))
- End Get
- <DebuggerStepThrough()> _
- Set(ByVal NewValue As Func(Of Object, Object))
- SetValue(BackConversionProperty, NewValue)
- End Set
- End Property
- Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As CultureInfo) As Object Implements IValueConverter.Convert
- Return Conversion(value)
- End Function
- Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
- Return BackConversion(value)
- End Function
- End Class
- End Namespace
Also was es tut ist Konvertieren (mit der Convert()-Methode) und Zurück-Konvertieren (mit der ConvertBack()-Methode - potzblitz!).
Convert() und ConvertBack() sind Bestandteile der IValueConverter-Schnittstelle - vom Framework so vorgegeben.
Einem Binding, was Konvertierung unterstützen soll, kann man ein beliebiges Dingsbums als Converter zuweisen - hauptsache, das Dingsbums implementiert IValueConverter - dann kann das Binding nämlich Convert() und ConvertBack() aufrufen, wenn ihm danach ist
Also nochmal genau DelegateConverter angeguckt: Es gibt die Property Conversion As Func(Of Object, Object), also eine Function, die ein Object entgegennimmt, und ein Object zurückgibt.
Und es gibt den Schnittstellen-Member Convert(), welcher auch ein Object entgegennimmt (und noch 2 weitere Argumente), und ein Object zurückgibt.
Und dieses Convert() tut nix anneres (Zeile#32), als die in Conversion gespeicherte Function aufzurufen, mit value als Argument, und davon das Ergebnis returnen.
Das ViewModel
Hier das bahnbrechende ViewModel, mit all seinen Properties, weil an was anneres als an Properties kann Xaml leider nicht binden:
VB.NET-Quellcode
- Imports GalaSoft.MvvmLight
- Imports System.IO
- Imports GalaSoft.MvvmLight.Command
- Public Class MainModel : Inherits MainModelBase(Of MainModel)
- Private _DataFile As New FileInfo("..\..\Data.Xml")
- Public Property Measures As New MeasureDts
- Public Property ReLoad As New RelayCommand( _
- Sub()
- Measures.ReadXml(_DataFile.FullName)
- Measures.AcceptChanges()
- End Sub, _
- Function() Measures.HasChanges)
- Public Property Save As New RelayCommand( _
- Sub()
- Measures.WriteXml(_DataFile.FullName)
- Measures.AcceptChanges()
- System.Media.SystemSounds.Asterisk.Play()
- End Sub, _
- Function() Measures.HasChanges)
- Public Property GenerateRandom As New RelayCommand( _
- Sub()
- Dim rnd As New Random
- Dim dt = Date.Now
- For i = 0 To 15
- Measures.Measure.AddMeasureRow(dt.AddSeconds(rnd.Next(3600)), Math.Round(rnd.NextDouble * 15, 2))
- Next
- End Sub)
- Private Shared _Colors As New ThresholdDictionary(Of Double, SolidColorBrush)(Brushes.AliceBlue) From { _
- {2, Brushes.LightBlue}, {4, Brushes.Turquoise}, {6, Brushes.LightGreen}, {8, Brushes.GreenYellow}, {10, Brushes.Yellow}, {12, Brushes.Gold}, {14, Brushes.Orange}}
- Public Property ColorConversion As Func(Of Object, Object) = Function(value) _Colors(DirectCast(value, Double))
- Public Sub New()
- If MyBase.IsProvisional Then Return
- ReLoad.Execute(Nothing)
- End Sub
- End Class
- Public Property Measures As MeasureDts
ein typisiertes Dataset mit Messwerten - Public Property ReLoad As RelayCommand
ein Command zum Laden - Public Property Save As RelayCommand
ein Command zum Speichern (kommt euch das eiglich nicht blöd vor, wenn ich erkläre, dass das Save-Commad zum Speichern ist? ;)) - Public Property GenerateRandom As RelayCommand
ein Command zum Generieren von Zufalls-Werten - Public Property ColorConversion As Func(Of Object, Object)
eine anonyme Function, die ein Object in ein anneres konvertiert (nämlich einen Double in einen SolidColorBrush).
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()