locked
Abhängigkeitseigenschaft eines Behaviors im PropertyChangedCallback validieren und Wert erzwingen RRS feed

  • 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
  • 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 08:53
    Beantworter
  • 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
  • Freitag, 4. Februar 2011 13:43
    Beantworter
  • 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
    Freitag, 4. Februar 2011 16:16