2017-05-02 1 views
1

Je souhaite effectuer une liaison bidirectionnelle entre ma ViewModel et la date sélectionnée (unique) dans ma vue de calendrier XAML. Mais nous n'avons aucune propriété de dépendance pour le faire.UWP: Liaison de la date sélectionnée dans la vue du calendrier

Que faire?

EDIT: le code que j'ai essayé mais je suis erreur. Son la combinaison de ces deux sujets: How to use CalenderView in UWP MVVM How to select rang of dates on finger slide on Calendar Control - UWP Win10 VS2015 XAML:

<CalendarView MinHeight="250" MaxHeight="500" MaxWidth="720" FontWeight="Normal" 
      DayItemFontWeight="Light" MinWidth="100" 
          SelectionMode="Single" 
          Style="{StaticResource Mahcalenderstyle}" Visibility="Visible" 
      HorizontalAlignment="Stretch" x:Name="MyCalendarView" DisplayMode="Month" Margin="9,25,9,0" 
      VerticalAlignment="Top" SelectedDatesChanged="CalendarView_SelectedDatesChanged" 
      CalendarViewDayItemStyle="{StaticResource CalendarViewDayItemStyle1}" 
          /> 

Et ma VM:

private DateTimeOffset _selecteddate; 
    public DateTimeOffset SelectedDate 
    { 
     get 
     { 
      return _selecteddate; 

     } 
     set 
     { 

      if (_selecteddate != value) 
      { 
       _selecteddate = value; 
       if (PropertyChanged != null) 
       { 
        PropertyChanged(this, 
         new PropertyChangedEventArgs("SelectedDate")); 
       } 
      } 
     } 
    } 
    public CalendarViewModel() 
    { 

     SelectedDate = DateTimeOffset.Now;} 

L'assistant:

public static class CalendarViewHelper 
{ 
    public static IList<DateTimeOffset> GetSelectedDates(DependencyObject obj) 
    { 
     return (IList<DateTimeOffset>)obj.GetValue(SelectedDatesProperty); 
    } 

    public static void SetSelectedDates(DependencyObject obj, IList<DateTimeOffset> value) 
    { 
     obj.SetValue(SelectedDatesProperty, value); 
    } 

    public static readonly DependencyProperty SelectedDatesProperty = 
     DependencyProperty.RegisterAttached("SelectedDates", typeof(IList<DateTimeOffset>), typeof(CalendarView), 
      new PropertyMetadata(null, (d, e) => 
      { 
       var cv = d as CalendarView; 
       var dates = e.NewValue as IList<DateTimeOffset>; 

       if (cv != null && dates != null) 
       { 
        foreach (var date in dates) 
        { 
         cv.SelectedDates.Add(date); 
        } 
       } 
      })); 

} 
+3

Qu'est-ce que vous avez essayé jusqu'à présent? –

+0

@NoorAShuvo Nothind que spécial. Je ne ai rien trouvé :( http://stackoverflow.com/questions/37258070/how-to-use-calenderview-in-uwp-mvvm je l'ai fait, mais n'a pas fonctionné – Mohsen

+0

S'il vous plaît partager le code que vous avez essayé ou que vous avez gagné » – Alex

Répondre

2

Vous devez créer un joint propriété d'un DateTimeOffset, pas un IList<DateTimeOffset> puisque vous voulez seulement sélectionner un date.

Ainsi, au lieu du code copié au-dessus de mon autre réponse, vous aurez besoin quelque chose comme ça -

public static class CalendarViewHelper 
{ 
    public static DateTimeOffset GetSelectedDate(DependencyObject obj) 
    { 
     return (DateTimeOffset)obj.GetValue(SelectedDateProperty); 
    } 

    public static void SetSelectedDate(DependencyObject obj, DateTimeOffset value) 
    { 
     obj.SetValue(SelectedDateProperty, value); 
    } 

    public static readonly DependencyProperty SelectedDateProperty = 
     DependencyProperty.RegisterAttached("SelectedDate", typeof(DateTimeOffset), typeof(CalendarView), 
      new PropertyMetadata(null, (d, e) => 
      { 
       var cv = (CalendarView)d; 
       var date = (DateTimeOffset)e.NewValue; 

       cv.SelectedDates.Clear(); 
       cv.SelectedDates.Add(date); 
      })); 
} 

Notez que vous devrez appeler Clear pour effacer toute la date sélectionnée précédemment (s) parce que le SelectionMode est défini sur Single, sans le faire, une erreur sera générée.

Ensuite, vous aurez juste besoin de le brancher en XAML avec votre propriété SelectedDate.

<CalendarView SelectionMode="Single" 
        DisplayMode="Month" 
        local:CalendarViewHelper.SelectedDate="{x:Bind SelectedDate, Mode=OneWay}" /> 
+0

Hey, j'ai eu la même erreur que précédemment dans this.InitializeComponent(); Windows.UI.Xaml.Markup.XamlParseException: 'Le texte associé à ce code d'erreur est introuvable. Impossible d'attribuer à la propriété 'Denna.Classes.CalendarViewHelper.SelectedDate'.[Ligne: 60 Position: 58] ' – Mohsen

+0

Je donne pourquoi quand je x: lier de la propriété locale ça va bien, mais quand j'utilise la liaison de ma machine virtuelle, elle est en cause :( – Mohsen

+0

Mettez votre code dans un exemple de projet n m'envoyer le lien –