Autor Beitrag
Määx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Di 16.09.14 10:31 
Hallo zusammen,

ich habe angefangen mir einen eigenen TimePicker zu basteln (zunächst als UserControl, später als CustomControl). Da zu habe ich eine DependencyProperty angelegt, die die Zeit zwischen dem Control und dessen Host synchronisieren soll:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
public partial class TimePicker : UserControl, INotifyPropertyChanged
{
   [...]
   DateTime _Time = DateTime.Now;
   [Description("The time displayed by the timePicker"), Category("Time Control")]
        public DateTime Time
        {
            get { return (DateTime)GetValue(TimeProperty); }
            set {
                  if(_Time.Equals(value))
                    return;

                  if (value != null)
                      _Time = value;
                  else
                      _Time = new DateTime(201411000); //DateTime.Now;
                  
                  OnPropertyChanged("Time");
                  OnPropertyChanged("TimeHour");
                  OnPropertyChanged("TimeMinute");
                  OnPropertyChanged("TimeSecond");
                  SetValue(TimeProperty, Time); }
        }
   public static readonly DependencyProperty TimeProperty = DependencyProperty.Register("Time"typeof(DateTime), typeof(TimePicker)); 
   [...]
}


Die einzelnen Textfelder des TimePicker binden sich dann an die Variablen TimeHour, TimeMinute, TimeSecond, die die Werte aus Time berechnen bzw Time neu setzen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
public string TimeHour
{
  get
  {
    return Time.Hour.ToString("00");
  }
  set
  {
    int hour;
    if (int.TryParse(value, out hour))
    {
       if (hour >= 24)
         Time = new DateTime(Time.Year, Time.Month, Time.Day, 0, Time.Minute, Time.Second);
       else if (hour < 0)
         Time = new DateTime(Time.Year, Time.Month, Time.Day, 0, Time.Minute, Time.Second);
       else
         Time = new DateTime(Time.Year, Time.Month, Time.Day, hour, Time.Minute, Time.Second);
    }
  }
}


Binde ich mein Control nun jedoch in meinem xaml ein
ausblenden C#-Quelltext
1:
2:
<wpfCon:TimePicker Time="{Binding LeadingDateTime}"/>
<DatePicker SelectedDate="{Binding LeadingDateTime}"/>

erhalte ich folgenden Fehler:
System.Windows.Data Error: 40 : BindingExpression path error: 'LeadingDateTime' property not found on 'object' ''TimePicker' (Name='')'. BindingExpression:Path=LeadingDateTime; DataItem='TimePicker' (Name=''); target element is 'TimePicker' (Name=''); target property is 'Time' (type 'DateTime')
und der TimePicker wird nicht korrekt initialisiert, der DatePicker hingegen schon...

Hat jemand eine Idee was ich hier falsch mache?
Vielen Dank
Määx
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 16.09.14 12:57 
Hallo Määx,

den Compiler-Fehler kann ich mir nicht erklären, aber du hast auf jeden Fall einen allgemeinen Fehler bei dir im Code bzgl. der DependencyProperty.
Lies dir mal einige Tutorials dazu durch:
Dependency Properties
How to: Implement a Dependency Property
WPF Tutorial - Dependency Property

Insbesondere aus dem ersten Link aus Abschnitt "How to create a DependencyProperty":
Zitat:
Important: Do not add any logic to these properties, because they are only called when you set the property from code. If you set the property from XAML the SetValue() method is called directly.

Im Getter und Setter darf also nur der Aufruf von GetValue bzw. SetValue stehen - nichts anderes - damit es konsistent bzgl. Codeaufrufen und aus dem XAML generierten Aufrufen ist!

Weitere Infos dazu findest du unter den Suchwörten "dependency property setter not called".

Evtl. kann dir hier der (optionale) 4. Parameter von DependencyProperty.Register helfen: PropertyMetadata.
Määx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Di 16.09.14 14:24 
ah ok, super vielen Dank für die Infos! Dann schaue ich mir zunächst einmal die Tutorials an und ändere die Sache mit der property...
Den Compilerfehler verstehe ich leider auch absolut nicht, da "LeadingDateTime" ja eigentlich niemals im "TimePicker" gesucht werden sollte, oder?

Vielen Dank
Määx