using System; using System.Windows; using System.Windows.Controls; using Tango.Core.Commands; //using System.Collections; using System.Linq; using System.Collections; namespace Tango.SharedUI.Controls { public class AllSelectedCheckboxList : ListBox { #region Properties private ItemsControl _itemsControl; public ItemsControl ItemsControl { get { return _itemsControl; } set { _itemsControl = value; } } public bool? AllSelected { get { return (bool?)GetValue(AllSelectedProperty); } set { SetValue(AllSelectedProperty, value); } } public static readonly DependencyProperty AllSelectedProperty = DependencyProperty.Register("AllSelected", typeof(bool?), typeof(AllSelectedCheckboxList), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(OnAllSelectedChanged))); private static void OnAllSelectedChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { AllSelectedCheckboxList l = o as AllSelectedCheckboxList; var nv = e.NewValue; l.AllSelectedChanged((bool?)nv); } public static DependencyProperty ClickCheckBoxCommandProperty = DependencyProperty.Register("ClickCheckBoxCommand", typeof(RelayCommand), typeof(AllSelectedCheckboxList)); public RelayCommand ClickCheckBoxCommand { get { return (RelayCommand)GetValue(ClickCheckBoxCommandProperty); } private set { SetValue(ClickCheckBoxCommandProperty, value); } } #endregion #region "Constructors" static AllSelectedCheckboxList() { DefaultStyleKeyProperty.OverrideMetadata(typeof(AllSelectedCheckboxList), new FrameworkPropertyMetadata(typeof(AllSelectedCheckboxList))); } public AllSelectedCheckboxList() : base() { ClickCheckBoxCommand = new RelayCommand(ClickCheckBox); } /// /// Clicks the CheckBox.Update Selection ListBoxitem. /// /// The object. private void ClickCheckBox(object obj) { if (obj is ListBoxItem) { ListBoxItem lbItem = obj as ListBoxItem; CheckBox checkBox = lbItem.FindVisualChildren().FirstOrDefault(); if (checkBox != null) { bool? check = checkBox.IsChecked; if (check != null) { lbItem.IsSelected = (bool)check; } } } if (SelectedItems.Count == 0) { AllSelected = false; } else if (Items.Count > 0 && SelectedItems.Count == Items.Count) { AllSelected = true; } else { AllSelected = null; } } #endregion #region Override /// /// When overridden in a derived class, is invoked whenever application code or internal processes call . /// public override void OnApplyTemplate() { base.OnApplyTemplate(); AllSelectedChanged(AllSelected); } protected override void OnSelectionChanged(SelectionChangedEventArgs e) { base.OnSelectionChanged(e); foreach(var addItem in e.AddedItems.OfType()) { addItem.IsSelected = true; } foreach (var removeItem in e.RemovedItems.OfType()) { removeItem.IsSelected = false; } } #endregion private void AllSelectedChanged(bool? value) { if (value == null) return; SelectionMode = SelectionMode.Multiple; if (value == true) { SelectAll(); } else { UnselectAll(); } } } }