11
votes

Comment se lier à Blackoutdates dans le contrôle du calendrier Toolkit WPF?

J'aimerais lier une liste de dates sur la propriété BlackoutDates, mais cela ne semble pas vraiment possible. Surtout dans un scénario MVVM. Quelqu'un a-t-il accompli quelque chose comme ça? Y a-t-il des bonnes contrôles calendaires qui jouent bien avec MVVM?


2 commentaires

Que se passe-t-il lorsque vous essayez de lier à BlackoutDates? Avez-vous une erreur?


Aucune blackoutdatdates n'est même pas une option ... Je suppose que j'utilise le dayskicker, mais je pensais que cela vient d'utiliser le calendrier et une zone de texte.


3 Réponses :


18
votes

Pour votre dilemme DaysPicker, j'ai trouvé un piratage NEAT à l'aide des propriétés ci-jointes (modifié à partir de mon utilisation de CommandBindings): XXX

Je suis sûr que je suis trop tard pour vous aider, Mais j'espère que quelqu'un d'autre le trouvera utile.


2 commentaires

Non, ce projet a été mis en attente pour le moment. Je ne suis pas sûr de bien comprendre les propriétés ci-jointes, mais je pensais que c'était un moyen de le faire, je ne savais pas comment à l'époque. Il est temps de revenir sur le wpf bandwagon.


Ouais, je ne suis pas à 100% des propriétés ci-jointes, mais il semble avoir deux utilisations: 1. Une alternative à un dictionnaire à clé dynamique-objet pour des données supplémentaires (comme l'objet Canvas), ou 2. une utilisation de la méthode d'extension de XAML. HMM, un wiki communautaire sur le sujet pourrait être vraiment intéressant.



6
votes

J'ai implémenté l'exemple ci-dessus (la classe ci-jointeProperty). J'ai créé une propriété dans mon viewModel comme ceci: xxx pré>

Cette vue inerite d'observablebase: p> xxx pré>

Ceci est le XAML dans la fenêtre qui Utilise cette propriété: P>

public List<CalendarDateRange> BlackoutDates
{
  etc.


0 commentaires

8
votes

Voici une version améliorée de la réponse de Matt qui nous permet de travailler avec les panneaux nackoutdates comme avec une collection observable normale (vous n'avez pas besoin de créer de nouvelles collections à chaque fois que vous souhaitez modifier les normes de blackoutDates). Nous stockons une liste de tous les calendriers et datchskickers liés et à l'intérieur de leur balise, nous stockons la collection utilisée dans MVVM. Une modification facile de la classe permettra de travailler avec Observablecollection si nécessaire:

// Adds a collection of command bindings to a date picker's existing BlackoutDates collection, since the collections are immutable and can't be bound to otherwise.
// Usage: <DatePicker hacks:AttachedProperties.RegisterBlackoutDates="{Binding BlackoutDates}" >
public class CalendarAttachedProperties : DependencyObject
{
    #region Attributes

    private static readonly List<Calendar> _calendars = new List<Calendar>();
    private static readonly List<DatePicker> _datePickers = new List<DatePicker>();

    #endregion

    #region Dependency Properties

    public static DependencyProperty RegisterBlackoutDatesProperty = DependencyProperty.RegisterAttached("RegisterBlackoutDates", typeof(ObservableCollection<DateTime>), typeof(CalendarAttachedProperties), new PropertyMetadata(null, OnRegisterCommandBindingChanged));

    public static void SetRegisterBlackoutDates(DependencyObject d, ObservableCollection<DateTime> value)
    {
        d.SetValue(RegisterBlackoutDatesProperty, value);
    }

    public static ObservableCollection<DateTime> GetRegisterBlackoutDates(DependencyObject d)
    {
        return (ObservableCollection<DateTime>)d.GetValue(RegisterBlackoutDatesProperty);
    }

    #endregion

    #region Event Handlers

    private static void CalendarBindings_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        ObservableCollection<DateTime> blackoutDates = sender as ObservableCollection<DateTime>;

        Calendar calendar = _calendars.First(c => c.Tag == blackoutDates);

        if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (DateTime date in e.NewItems)
            {
                calendar.BlackoutDates.Add(new CalendarDateRange(date));
            }
        }
    }

    private static void DatePickerBindings_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        ObservableCollection<DateTime> blackoutDates = sender as ObservableCollection<DateTime>;

        DatePicker datePicker = _datePickers.First(c => c.Tag == blackoutDates);

        if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (DateTime date in e.NewItems)
            {
                datePicker.BlackoutDates.Add(new CalendarDateRange(date));
            }
        }
    }

    #endregion

    #region Private Methods

    private static void OnRegisterCommandBindingChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        Calendar calendar = sender as Calendar;
        if (calendar != null)
        {
            ObservableCollection<DateTime> bindings = e.NewValue as ObservableCollection<DateTime>;
            if (bindings != null)
            {
                if (!_calendars.Contains(calendar))
                {
                    calendar.Tag = bindings;
                    _calendars.Add(calendar);
                }

                calendar.BlackoutDates.Clear();
                foreach (DateTime date in bindings)
                {
                    calendar.BlackoutDates.Add(new CalendarDateRange(date));
                }
                bindings.CollectionChanged += CalendarBindings_CollectionChanged;
            }
        }
        else
        {
            DatePicker datePicker = sender as DatePicker;
            if (datePicker != null)
            {
                ObservableCollection<DateTime> bindings = e.NewValue as ObservableCollection<DateTime>;
                if (bindings != null)
                {
                    if (!_datePickers.Contains(datePicker))
                    {
                        datePicker.Tag = bindings;
                        _datePickers.Add(datePicker);
                    }

                    datePicker.BlackoutDates.Clear();
                    foreach (DateTime date in bindings)
                    {
                        datePicker.BlackoutDates.Add(new CalendarDateRange(date));
                    }
                    bindings.CollectionChanged += DatePickerBindings_CollectionChanged;
                }
            }
        }
    }

    #endregion
}


0 commentaires