Abhängigkeitseigenschaft eines Behaviors im PropertyChangedCallback validieren und Wert erzwingen
-
Donnerstag, 3. Februar 2011 09:50
Hallo,
ich entwickle ein Behavior. Das Behavior hat eine Abhängigkeitseigenschaft. Nun möchte ich in der Behandlung des zugehörigen PropertyChangedCallback den neu gesetzten Wert validieren und bei Bedarf verändern.
Weiß jemand ob und wie das ggfls. geht?
Wenn es Quellcode-Beispiele gibt, wäre es super, wenn die in VB sind.
Beste Grüße,
Martin
Alle Antworten
-
Freitag, 4. Februar 2011 08:02
Also ich habe jetzt folgenden work around. Eine gute Lösung ist es in meinen Augen nicht, weil der PropertyChangedCallback mehrfach durchlaufen wird:
Public Shared Sub DummyValueChanged(ByVal sender As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) Dim mySelf As Behavior(Of Image) = CType(CType(sender, Behavior), Global.System.Windows.Interactivity.Behavior(Of Global.System.Windows.Controls.Image)) If CType(e.NewValue, Double) < 1 Then mySelf.SetValue(DummyProperty, CDbl(1)) Else If CType(e.NewValue, Double) > 400 Then mySelf.SetValue(DummyProperty, CDbl(400)) End If End If End Sub
Der neue Wert wird zwar validiert und ein zulässiger auch erzwungen. Aber wenn der ursprüngliche Wert unzulässig war, wird der Callback zwei mal durchlaufen.
Hat jemand noch andere Ideen?
-
Freitag, 4. Februar 2011 08:53Beantworter
Es ist ziemlich schwierig das Problem zu erkennen, ohne den ganzen Code des Behaviors zu sehen.
Kannst du mal ein wenig mehr posten? -
Freitag, 4. Februar 2011 12:58
Hier ist der maßgebliche Quellcode. Nichts Besonderes eigentlich.
Public Shared ReadOnly DummyProperty As DependencyProperty = DependencyProperty.Register("Dummy", GetType(Double), GetType(DummyBehavior), New PropertyMetadata(CDbl(1), New PropertyChangedCallback(AddressOf DummyValueChanged))) Public Property Dummy() As Double Get Return (CType(GetValue(DummyProperty), Double)) End Get Set(ByVal value As Double) SetValue(DummyProperty, value) End Set End Property Public Shared Sub DummyValueChanged(ByVal sender As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) Dim mySelf As Behavior(Of Image) = CType(CType(sender, Behavior), Global.System.Windows.Interactivity.Behavior(Of Global.System.Windows.Controls.Image)) If CType(e.NewValue, Double) < 1 Then mySelf.SetValue(DummyProperty, CDbl(1)) Else If CType(e.NewValue, Double) > 400 Then mySelf.SetValue(DummyProperty, CDbl(400)) End If End If End Sub
-
Freitag, 4. Februar 2011 13:43Beantworter
Schau mal hier, dort wird eine Validierung im Callback durchgeführt:
http://geekswithblogs.net/Silverlight2/archive/2008/12/24/understanding-dependency-properties-in-silverlight.aspx -
Freitag, 4. Februar 2011 16:16Moderator
Der neue Wert wird zwar validiert und ein zulässiger auch erzwungen. Aber wenn der ursprüngliche Wert unzulässig war, wird der Callback zwei mal durchlaufen.
Hallo Martin,
ich glaube das wird zumindest auf dem "PropertyChanged" - Weg nicht anders gehen, da beim Aufruf des Events die Änderung bereits durchgeführt wurde. Das Event ist sozusagen nachgelagert. Du hast auch keine Chance die Werte anders zu setzten, da für NewValue die "set" - Funktion nicht implementiert ist.
Daniel
http://www.silverlight-community.de - deutsche Community mit Tutorials, Blogs und Usergroups

