Fragensteller
Abhängigkeitseigenschaft eines Behaviors im PropertyChangedCallback validieren und Wert erzwingen

Frage
-
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
Donnerstag, 3. Februar 2011 09:50
Alle Antworten
-
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:02 -
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 12:58 -
Schau mal hier, dort wird eine Validierung im Callback durchgeführt:
http://geekswithblogs.net/Silverlight2/archive/2008/12/24/understanding-dependency-properties-in-silverlight.aspxFreitag, 4. Februar 2011 13:43Beantworter -
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 UsergroupsFreitag, 4. Februar 2011 16:16