using System.Diagnostics; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; using Microsoft.Windows.Controls.Ribbon; using System.Collections.ObjectModel; using System.Collections.Specialized; /// /// Extends Control functionality /// namespace MVVMRibbon.Behaviors { /// /// Extends Ribbon functionality /// public class BindControlsOfGroup : DependencyObject { #region Dependency Properties #region Command Property /// /// Enables Command functionality /// public static INotifyCollectionChanged GetCollectionToSync(DependencyObject obj) { return (INotifyCollectionChanged)obj.GetValue(CollectionToSyncProperty); } /// /// Enables Command functionality /// public static void SetCollectionToSync(DependencyObject obj, INotifyCollectionChanged value) { obj.SetValue(CollectionToSyncProperty, value); } /// /// Enables Command functionality /// public static readonly DependencyProperty CollectionToSyncProperty = DependencyProperty.RegisterAttached("CollectionToSyncProperty", typeof(INotifyCollectionChanged), typeof(BindControlsOfGroup), new UIPropertyMetadata(null, new PropertyChangedCallback(BindingPropertyChanged))); /// /// Command property changed callback /// static void BindingPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { Debug.Assert(sender is RibbonGroup, "Attached property only for RibbonGroup"); RibbonGroup ribbonGroup = sender as RibbonGroup; if (ribbonGroup != null) { // Clean when Command is released if (e.OldValue != null) { Detach(ribbonGroup); } if (e.NewValue != null) { Attach(ribbonGroup); } } } #endregion #endregion #region Event #endregion #region Private methods /// /// Clean event handlers /// /// TextBox spécifiée private static void Detach(RibbonGroup ribbonGroup) { //Enlever le gestionnaire d'événements ici } private static void Attach(RibbonGroup ribbonGroup) { INotifyCollectionChanged collection = BindControlsOfGroup.GetCollectionToSync(ribbonGroup as DependencyObject); if (collection != null) { collection.CollectionChanged += (object sender, NotifyCollectionChangedEventArgs e) => { switch (e.Action) { case NotifyCollectionChangedAction.Add: foreach (object obj in e.NewItems) { // Tu peux utiliser tes propres interfaces et les convertir en IRibbonControl aussi... ribbonGroup.Controls.Add(obj as IRibbonControl); } break; case NotifyCollectionChangedAction.Remove: foreach (object obj in e.NewItems) // Tu peux utiliser tes propres interfaces et les convertir en IRibbonControl aussi... ribbonGroup.Controls.Remove(obj as IRibbonControl); break; case NotifyCollectionChangedAction.Reset: ribbonGroup.Controls.Clear(); break; } }; } } #endregion } }