All the controls missing in WPF. Over 1 million downloads.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
4.7 KiB

/*************************************************************************************
Toolkit for WPF
Copyright (C) 2007-2020 Xceed Software Inc.
This program is provided to you under the terms of the XCEED SOFTWARE, INC.
COMMUNITY LICENSE AGREEMENT (for non-commercial use) as published at
https://github.com/xceedsoftware/wpftoolkit/blob/master/license.md
For more features, controls, and fast professional support,
pick up the Plus Edition at https://xceed.com/xceed-toolkit-plus-for-wpf/
Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
***********************************************************************************/
using System.Collections.Specialized;
using System.Windows;
using System.Linq;
namespace Xceed.Wpf.Toolkit.Primitives
{
[TemplatePart( Name = PART_SelectAllSelectorItem, Type = typeof( SelectAllSelectorItem ) )]
public class SelectAllSelector : Selector
{
private const string PART_SelectAllSelectorItem = "PART_SelectAllSelectorItem";
#region Members
private SelectAllSelectorItem _selectAllSelecotrItem;
#endregion
#region Properties
#region IsSelectAllActive
public static readonly DependencyProperty IsSelectAllActiveProperty = DependencyProperty.Register( "IsSelectAllActive", typeof( bool ), typeof( SelectAllSelector ), new UIPropertyMetadata( false, OnIsSelectAllActiveChanged ) );
public bool IsSelectAllActive
{
get
{
return ( bool )GetValue( IsSelectAllActiveProperty );
}
set
{
SetValue( IsSelectAllActiveProperty, value );
}
}
private static void OnIsSelectAllActiveChanged( DependencyObject o, DependencyPropertyChangedEventArgs e )
{
var selector = o as SelectAllSelector;
if( selector != null )
selector.OnIsSelectAllActiveChanged( ( bool )e.OldValue, ( bool )e.NewValue );
}
protected virtual void OnIsSelectAllActiveChanged( bool oldValue, bool newValue )
{
if( newValue && ( this.Items.Count > 0 ) )
{
this.UpdateSelectAllSelectorItem();
}
}
#endregion //IsSelectAllActive
#region SelectAllContent
public static readonly DependencyProperty SelectAllContentProperty = DependencyProperty.Register( "SelectAllContent", typeof( object ), typeof( SelectAllSelector ), new UIPropertyMetadata( "Select All" ) );
public object SelectAllContent
{
get
{
return ( object )GetValue( SelectAllContentProperty );
}
set
{
SetValue( SelectAllContentProperty, value );
}
}
#endregion
#endregion
#region Overrides
protected override void OnSelectedItemsCollectionChanged( object sender, NotifyCollectionChangedEventArgs e )
{
base.OnSelectedItemsCollectionChanged( sender, e );
this.UpdateSelectAllSelectorItem();
}
protected override void OnItemsChanged( NotifyCollectionChangedEventArgs e )
{
base.OnItemsChanged( e );
this.UpdateSelectAllSelectorItem();
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_selectAllSelecotrItem = this.GetTemplateChild( PART_SelectAllSelectorItem ) as SelectAllSelectorItem;
}
#endregion
#region Public Methods
public void SelectAll()
{
// Have a faster selection when there are more than 200 items.
this.UpdateSelectedItemsWithoutNotifications( this.ItemsCollection.Cast<object>().ToList() );
// Raise SelectionChanged for every items.
foreach( var item in this.ItemsCollection )
{
this.OnItemSelectionChanged( new ItemSelectionChangedEventArgs( Selector.ItemSelectionChangedEvent, this, item, true ) );
}
}
public void UnSelectAll()
{
this.SelectedItems.Clear();
}
#endregion
#region Private Methods
private void UpdateSelectAllSelectorItem()
{
if( _selectAllSelecotrItem != null )
{
// All items are selected; select the SelectAll option.
if( this.Items.Count == this.SelectedItems.Count )
{
_selectAllSelecotrItem.ModifyCurrentSelection( true );
}
// Some items are selected; set the SelectAll option to null.
else if( this.SelectedItems.Count > 0 )
{
_selectAllSelecotrItem.ModifyCurrentSelection( null );
}
// No items are selected; unselect the SelectAll option.
else
{
_selectAllSelecotrItem.ModifyCurrentSelection( false );
}
}
}
#endregion
}
}