none
DependencyProperty WPF-Parameter in eine Klasse RRS feed

  • Frage

  • Salü zäme
    Ich möchte eine Klasse (3 Integer-Werte) in eine DependencyProperty einbauen. Dieses soll als Parameter-Feld in WPF genutzt werden können (Min- bzw. Max-Wert).
    Kann ich das und wie übergebe ich die Parameter?
    In einen Beispiel mit einem TimeSan-DependencyProperty habe ich gesehen dass dies wie folgt aussieht:

    ....
    <wt:Steuerelement MinValue="12:00:00"/>
    .....

    Ist das allgemein so, dieser Doppelpunkt als Trenner, oder ist hier irgend ein Converter dazwischen, welcher dieser Wert in ein TimeSpan umrechnet. Falls ja, wie definiere ich einen soclhe Converter in einem User-Steuerelement?

    Danke und Gruss
    Jakob


    Jakob Brunner, Switzerland
    Freitag, 19. November 2010 10:27

Antworten

  • Hallo Jakob,

    Du müsstest eigentlich nur die DP bereitstellen, halt vom entspr. Typ:

    public TimeSpan TheTimeSpan
    {
      get { return (TimeSpan)GetValue(TheTimeSpanProperty); }
      set { SetValue(TheTimeSpanProperty, value); }
    }
    public static readonly DependencyProperty TheTimeSpanProperty =
     DependencyProperty.Register(
         "TheTimeSpan", 
         typeof(TimeSpan), 
         typeof(TheUserControl), 
         new UIPropertyMetadata(new TimeSpan(0,0,0),
          (o, e) =>
          {
            MessageBox.Show("New value: " + ((TimeSpan)e.NewValue).ToString());
          })
       );
    
    

    Ein Converter ist nicht notwendig, wenn der Typ in der DP richtig/explizit festgelegt wurde. Die einzelnen Bestandteile der TimeSpan (.Hours ... .Milliseconds) kannst Du im Code ja ohnehin ansprechen. Im XAML erlaubt die TimeSpan Notation, dass von ausschließlich Stunden (TheTimeSpan="05") bis hin zu Stunden:Minuten:Sekunden.Millisekunden (TheTimeSpan="05:04:03.123" - ms mit vorangestelltem Punkt!) angegeben werden können - dafür musst Du code-seitig absolut nichts tun.

    angeben


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Samstag, 20. November 2010 11:03

Alle Antworten

  • Bei dem Beispiel wird wohl intern die Parse Methode genutzt um.

    Ich würde einen ValueConverter für die Klasse erstellen, der den Wert dann in die Klasse umwandelt und umgekehrt wieder in den Wert.

     

    Freitag, 19. November 2010 10:39
    Beantworter
  • Hallo Jakob,

    Du möchtest 3 Integer-Werte in einer DependencyProperty speichern? Dann musst Du die DependencyProperty vom Typ einer Collection oder vom Typ einer speziellen Klasse machen, die selbst wiederum drei Properties vom Typ int hat.

    Damit es in XAML richtig geparst werden kann, erstellst Du eine Subklasse von TypeConverter und überschreibst die Methode ConvertFrom und machst aus dem erhaltenen String deinen konkreten Typen.


    Thomas Claudius Huber - http://www.thomasclaudiushuber.com
    Freitag, 19. November 2010 14:45
  • Hallo Jakob,

    Du müsstest eigentlich nur die DP bereitstellen, halt vom entspr. Typ:

    public TimeSpan TheTimeSpan
    {
      get { return (TimeSpan)GetValue(TheTimeSpanProperty); }
      set { SetValue(TheTimeSpanProperty, value); }
    }
    public static readonly DependencyProperty TheTimeSpanProperty =
     DependencyProperty.Register(
         "TheTimeSpan", 
         typeof(TimeSpan), 
         typeof(TheUserControl), 
         new UIPropertyMetadata(new TimeSpan(0,0,0),
          (o, e) =>
          {
            MessageBox.Show("New value: " + ((TimeSpan)e.NewValue).ToString());
          })
       );
    
    

    Ein Converter ist nicht notwendig, wenn der Typ in der DP richtig/explizit festgelegt wurde. Die einzelnen Bestandteile der TimeSpan (.Hours ... .Milliseconds) kannst Du im Code ja ohnehin ansprechen. Im XAML erlaubt die TimeSpan Notation, dass von ausschließlich Stunden (TheTimeSpan="05") bis hin zu Stunden:Minuten:Sekunden.Millisekunden (TheTimeSpan="05:04:03.123" - ms mit vorangestelltem Punkt!) angegeben werden können - dafür musst Du code-seitig absolut nichts tun.

    angeben


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Samstag, 20. November 2010 11:03