2016-08-02 36 views
0

Ich verwende einen regulären WPF-Kalender (System.Windows.Controls.Calendar) in einer MVVM-Anwendung. Der Kalender zeigt jeweils einen Monat an und der Benutzer wählt einen einzelnen Tag aus. Der Kalender zeigt unten einige Tage des nächsten Monats, was in Ordnung ist.Kalenderdatenbindung wählt falsches Datum

Das Problem ist, dass, wenn ich ein Datum aus dem nächsten Monat (z. B. der 2. des nächsten Monats) wählen, dann aktualisiert Kalender zuerst die Datenbindung mit diesem Datum, und dann sofort aktualisiert es wieder mit dem ersten der Monat!

Das passiert für alle Daten im nächsten Monat, die ich auswähle.

Die SelectedDate- und DisplayDate-Eigenschaften des Kalenders sind Daten, die an die Date-Eigenschaft des Ansichtsmodells gebunden sind.

<Calendar SelectedDate="{Binding Date}" DisplayDate="{Binding Date}" /> 

Der Blick Modell sieht wie folgt aus

public class CalendarProblemDemoViewModel : INotifyPropertyChanged 
{ 
    private DateTime _date; 

    public CalendarProblemDemoViewModel() 
    { 
     _date = DateTime.Today; 
    } 

    public DateTime Date 
    { 
     get { return _date; } 
     set 
     { 
      _date = value; 
      Debug.Write($"new date {_date}\n"); 
      OnPropertyChanged(nameof(Date)); 
     } 
    } 
    // Note: other code omitted, see the github project 
} 

Ich verstehe nicht, warum dies geschieht?

+1

So gebunden Sie beide an die gleiche Eigenschaft "Date". Haben Sie versucht zu sehen, ob 'SelectedDate' sich von' DisplayDate' unterscheidet? –

+1

Das löst tatsächlich das Problem LOL! Es hat also mit den inneren Funktionen von Calendar zu tun? Ich denke, ich feuere den Disassembler an und schaue nach. – Grubl3r

+0

Froh wir konnten helfen :) –

Antwort

1

Sie sollten SelectedDate und DisplayDate nicht an dieselbe Eigenschaft Date binden.

+0

Das ist die richtige Antwort, aber ich verstehe nicht, warum das wirklich ist? – Grubl3r

+1

Es zeigt ein aktuelles Datum an (nicht das Grau), aber Sie könnten ein anderes Datum wählen (das Grau). Wenn Sie also beide Objekte an dieselbe Eigenschaft binden, nimmt die Eigenschaft immer die Angezeigten, auch wenn Ausgewählt anders ist. –

+1

Sie können beides behalten, wenn Sie dies tun: 'DisplayDate =" {Binding SelectedDate, Modus = OneTime, UpdateSourceTrigger = PropertyChanged} " SelectedDate =" {Binding SelectedDate, Modus = TwoWay, UpdateSourceTrigger = PropertyChanged} "' –