@ -16,426 +16,425 @@
using System.ComponentModel ;
using System.ComponentModel ;
using System.Diagnostics ;
using System.Diagnostics ;
using System.Drawing ;
using System.Windows ;
using System.Windows ;
using System.Windows.Automation.Peers ;
using System.Windows.Controls ;
using System.Windows.Controls ;
using System.Windows.Controls.Primitives ;
using System.Windows.Controls.Primitives ;
using System.Windows.Input ;
using System.Windows.Input ;
using System.Windows.Media ;
using Xceed.Utils.Wpf ;
using Xceed.Utils.Wpf ;
using Xceed.Wpf.DataGrid.Utils ;
using Xceed.Wpf.DataGrid.Utils ;
namespace Xceed.Wpf.DataGrid
namespace Xceed.Wpf.DataGrid
{
{
public class GroupHeaderControl : ContentControl , INotifyPropertyChanged , IDataGridItemContainer
public class GroupHeaderControl : ContentControl , INotifyPropertyChanged , IDataGridItemContainer
{
#region Static Fields
internal static readonly string GroupPropertyName = PropertyHelper . GetPropertyName ( ( GroupHeaderControl g ) = > g . Group ) ;
#endregion
static GroupHeaderControl ( )
{
{
// This DefaultStyleKey will only be used in design-time.
#region Static Fields
DefaultStyleKeyProperty . OverrideMetadata ( typeof ( GroupHeaderControl ) , new FrameworkPropertyMetadata ( new Markup . ThemeKey ( typeof ( Views . TableView ) , typeof ( GroupHeaderControl ) ) ) ) ;
DataGridControl . ParentDataGridControlPropertyKey . OverrideMetadata ( typeof ( GroupHeaderControl ) , new FrameworkPropertyMetadata ( new PropertyChangedCallback ( OnParentGridControlChanged ) ) ) ;
internal static readonly string GroupPropertyName = PropertyHelper . GetPropertyName ( ( GroupHeaderControl g ) = > g . Group ) ;
KeyboardNavigation . TabNavigationProperty . OverrideMetadata (
#endregion
typeof ( GroupHeaderControl ) , new FrameworkPropertyMetadata ( KeyboardNavigationMode . None ) ) ;
}
public GroupHeaderControl ( )
static GroupHeaderControl ( )
{
{
this . CommandBindings . Add ( new CommandBinding ( DataGridCommands . ExpandGroup ,
// This DefaultStyleKey will only be used in design-time.
this . OnExpandExecuted ,
DefaultStyleKeyProperty . OverrideMetadata ( typeof ( GroupHeaderControl ) , new FrameworkPropertyMetadata ( new Markup . ThemeKey ( typeof ( Views . TableView ) , typeof ( GroupHeaderControl ) ) ) ) ;
this . OnExpandCanExecute ) ) ;
this . CommandBindings . Add ( new CommandBinding ( DataGridCommands . CollapseGroup ,
DataGridControl . ParentDataGridControlPropertyKey . OverrideMetadata ( typeof ( GroupHeaderControl ) , new FrameworkPropertyMetadata ( new PropertyChangedCallback ( OnParentGridControlChanged ) ) ) ;
this . OnCollapseExecuted ,
this . OnCollapseCanExecute ) ) ;
this . CommandBindings . Add ( new CommandBinding ( DataGridCommands . ToggleGroupExpansion ,
KeyboardNavigation . TabNavigationProperty . OverrideMetadata (
this . OnToggleExecuted ,
typeof ( GroupHeaderControl ) , new FrameworkPropertyMetadata ( KeyboardNavigationMode . None ) ) ;
this . OnToggleCanExecute ) ) ;
}
m_itemContainerManager = new DataGridItemContainerManager ( this ) ;
public GroupHeaderControl ( )
}
{
this . CommandBindings . Add ( new CommandBinding ( DataGridCommands . ExpandGroup ,
this . OnExpandExecuted ,
this . OnExpandCanExecute ) ) ;
#region Group Internal Attached Property
this . CommandBindings . Add ( new CommandBinding ( DataGridCommands . CollapseGroup ,
this . OnCollapseExecuted ,
this . OnCollapseCanExecute ) ) ;
internal static readonly DependencyProperty GroupProperty = DependencyProperty . RegisterAttached (
this . CommandBindings . Add ( new CommandBinding ( DataGridCommands . ToggleGroupExpansion ,
"Group" , typeof ( Group ) , typeof ( GroupHeaderControl ) ,
this . OnToggleExecuted ,
new FrameworkPropertyMetadata ( null , FrameworkPropertyMetadataOptions . Inherits ) ) ;
this . OnToggleCanExecute ) ) ;
internal static Group GetGroup ( DependencyObject obj )
m_itemContainerManager = new DataGridItemContainerManager ( this ) ;
{
}
return ( Group ) obj . GetValue ( GroupHeaderControl . GroupProperty ) ;
}
internal static void SetGroup ( DependencyObject obj , Group value )
#region Group Internal Attached Property
{
obj . SetValue ( GroupHeaderControl . GroupProperty , value ) ;
}
#endregion
internal static readonly DependencyProperty GroupProperty = DependencyProperty . RegisterAttached (
"Group" , typeof ( Group ) , typeof ( GroupHeaderControl ) ,
new FrameworkPropertyMetadata ( null , FrameworkPropertyMetadataOptions . Inherits ) ) ;
#region Group Property
internal static Group GetGroup ( DependencyObject obj )
{
return ( Group ) obj . GetValue ( GroupHeaderControl . GroupProperty ) ;
}
public Group Group
internal static void SetGroup ( DependencyObject obj , Group value )
{
{
get
obj . SetValue ( GroupHeaderControl . GroupProperty , value ) ;
{
}
return m_group ;
}
}
internal void SetGroup ( Group group )
#endregion
{
m_group = group ;
this . Content = m_group ;
GroupHeaderControl . SetGroup ( this , group ) ;
this . RaisePropertyChanged ( GroupHeaderControl . GroupPropertyName ) ;
#region Group Property
}
private Group m_group ;
public Group Group
{
get
{
return m_group ;
}
}
#endregion
internal void SetGroup ( Group group )
{
m_group = group ;
this . Content = m_group ;
GroupHeaderControl . SetGroup ( this , group ) ;
#region SelectionBackground Property
this . RaisePropertyChanged ( GroupHeaderControl . GroupPropertyName ) ;
}
public static readonly DependencyProperty SelectionBackgroundProperty = Cell . SelectionBackgroundProperty . AddOwner ( typeof ( GroupHeaderControl ) ) ;
private Group m_group ;
public Brush SelectionBackground
#endregion
{
get
{
return ( Brush ) this . GetValue ( GroupHeaderControl . SelectionBackgroundProperty ) ;
}
set
{
this . SetValue ( GroupHeaderControl . SelectionBackgroundProperty , value ) ;
}
}
#end region SelectionBackground Property
#region SelectionBackground Property
#region SelectionForeground Property
public static readonly DependencyProperty SelectionBackgroundProperty = Cell . SelectionBackgroundProperty . AddOwner ( typeof ( GroupHeaderControl ) ) ;
public static readonly DependencyProperty SelectionForegroundProperty = Cell . SelectionForegroundProperty . AddOwner ( typeof ( GroupHeaderControl ) ) ;
public Brush SelectionBackground
{
get
{
return ( Brush ) this . GetValue ( GroupHeaderControl . SelectionBackgroundProperty ) ;
}
set
{
this . SetValue ( GroupHeaderControl . SelectionBackgroundProperty , value ) ;
}
}
public Brush SelectionForeground
#endregion SelectionBackground Property
{
get
{
return ( Brush ) this . GetValue ( GroupHeaderControl . SelectionForegroundProperty ) ;
}
set
{
this . SetValue ( GroupHeaderControl . SelectionForegroundProperty , value ) ;
}
}
#end region SelectionForeground Property
#region SelectionForeground Property
#region InactiveSelectionBackground Property
public static readonly DependencyProperty SelectionForegroundProperty = Cell . SelectionForegroundProperty . AddOwner ( typeof ( GroupHeaderControl ) ) ;
public static readonly DependencyProperty InactiveSelectionBackgroundProperty = Cell . InactiveSelectionBackgroundProperty . AddOwner ( typeof ( GroupHeaderControl ) ) ;
public Brush SelectionForeground
{
get
{
return ( Brush ) this . GetValue ( GroupHeaderControl . SelectionForegroundProperty ) ;
}
set
{
this . SetValue ( GroupHeaderControl . SelectionForegroundProperty , value ) ;
}
}
public Brush InactiveSelectionBackground
#endregion SelectionForeground Property
{
get
{
return ( Brush ) this . GetValue ( GroupHeaderControl . InactiveSelectionBackgroundProperty ) ;
}
set
{
this . SetValue ( GroupHeaderControl . InactiveSelectionBackgroundProperty , value ) ;
}
}
#end region InactiveSelectionBackground Property
#region InactiveSelectionBackground Property
#region InactiveSelectionForeground Property
public static readonly DependencyProperty InactiveSelectionBackgroundProperty = Cell . InactiveSelectionBackgroundProperty . AddOwner ( typeof ( GroupHeaderControl ) ) ;
public static readonly DependencyProperty InactiveSelectionForegroundProperty = Cell . InactiveSelectionForegroundProperty . AddOwner ( typeof ( GroupHeaderControl ) ) ;
public Brush InactiveSelectionBackground
{
get
{
return ( Brush ) this . GetValue ( GroupHeaderControl . InactiveSelectionBackgroundProperty ) ;
}
set
{
this . SetValue ( GroupHeaderControl . InactiveSelectionBackgroundProperty , value ) ;
}
}
public Brush InactiveSelectionForeground
#endregion InactiveSelectionBackground Property
{
get
{
return ( Brush ) this . GetValue ( GroupHeaderControl . InactiveSelectionForegroundProperty ) ;
}
set
{
this . SetValue ( GroupHeaderControl . InactiveSelectionForegroundProperty , value ) ;
}
}
#end region InactiveSelectionForeground Property
#region InactiveSelectionForeground Property
#region CanBeRecycled Protected Property
public static readonly DependencyProperty InactiveSelectionForegroundProperty = Cell . InactiveSelectionForegroundProperty . AddOwner ( typeof ( GroupHeaderControl ) ) ;
protected virtual bool CanBeRecycled
public Brush InactiveSelectionForeground
{
{
get
get
{
{
if ( this . IsKeyboardFocused | | this . IsKeyboardFocusWithin )
return ( Brush ) this . GetValue ( GroupHeaderControl . InactiveSelectionForegroundProperty ) ;
return false ;
}
set
{
this . SetValue ( GroupHeaderControl . InactiveSelectionForegroundProperty , value ) ;
}
}
return m_itemContainerManager . CanBeRecycled ;
#endregion InactiveSelectionForeground Property
}
}
#end region
#region CanBeRecycled Protected Property
public override void OnApplyTemplate ( )
protected virtual bool CanBeRecycled
{
{
base . OnApplyTemplate ( ) ;
get
{
if ( this . IsKeyboardFocused | | this . IsKeyboardFocusWithin )
return false ;
m_itemContainerManager . Update ( ) ;
return m_itemContainerManager . CanBeRecycled ;
}
}
}
#endregion
protected override void OnPreviewMouseLeftButtonUp ( MouseButtonEventArgs e )
public override void OnApplyTemplate ( )
{
{
base . OnPreviewMouseLeftButtonUp ( e ) ;
base . OnApplyTemplate ( ) ;
return ;
}
protected override void OnIsKeyboardFocusWithinChanged ( DependencyPropertyChangedEventArgs e )
m_itemContainerManager . Update ( ) ;
{
}
base . OnIsKeyboardFocusWithinChanged ( e ) ;
bool newValue = ( bool ) e . NewValue ;
if ( newValue = = true )
protected override void OnPreviewMouseLeftButtonUp ( MouseButtonEventArgs e )
{
{
DataGridContext dataGridContext = DataGridControl . GetDataGridContext ( this ) ;
base . OnPreviewMouseLeftButtonUp ( e ) ;
return ;
}
if ( dataGridContext ! = null )
protected override void OnIsKeyboardFocusWithinChanged ( DependencyPropertyChangedEventArgs e )
{
{
object item = dataGridContext . GetItemFromContainer ( this ) ;
base . OnIsKeyboardFocusWithinChanged ( e ) ;
if ( ( item ! = null ) & & ( dataGridContext . InternalCurrentItem ! = item ) )
bool newValue = ( bool ) e . NewValue ;
{
try
if ( newValue = = true )
{
{
dataGridContext . SetCurrent ( item , null , - 1 , dataGridContext . CurrentColumn , true , true , false , AutoScrollCurrentItemSourceTriggers . FocusChanged ) ;
DataGridContext dataGridContext = DataGridControl . GetDataGridContext ( this ) ;
if ( dataGridContext ! = null )
{
object item = dataGridContext . GetItemFromContainer ( this ) ;
if ( ( item ! = null ) & & ( dataGridContext . InternalCurrentItem ! = item ) )
{
try
{
dataGridContext . SetCurrent ( item , null , - 1 , dataGridContext . CurrentColumn , true , true , false , AutoScrollCurrentItemSourceTriggers . FocusChanged ) ;
}
catch ( DataGridException )
{
// We swallow the exception if it occurs because of a validation error or Cell was read-only or
// any other GridException.
}
}
}
}
}
catch ( DataGridException )
}
protected virtual void PrepareContainer ( DataGridContext dataGridContext , object item )
{
m_isRecyclingCandidate = false ;
if ( m_isContainerPrepared )
Debug . Fail ( "A GroupHeaderControl can't be prepared twice, it must be cleaned before PrepareContainer is called again" ) ;
Group group = null ;
DataGridContext gridContext = DataGridControl . GetDataGridContext ( this ) ;
if ( gridContext ! = null )
{
{
// We swallow the exception if it occurs because of a validation error or Cell was read-only or
object dataItem = gridContext . GetItemFromContainer ( this ) ;
// any other GridException.
if ( dataItem ! = null )
{
group = gridContext . GetGroupFromItem ( dataItem ) ;
}
}
}
}
}
}
}
protected virtual void PrepareContainer ( DataGridContext dataGridContext , object item )
this . SetGroup ( group ) ;
{
m_isRecyclingCandidate = false ;
if ( m_isContainerPrepared )
m_itemContainerManager . Prepare ( gridContext , item ) ;
Debug . Fail ( "A GroupHeaderControl can't be prepared twice, it must be cleaned before PrepareContainer is called again" ) ;
Group group = null ;
m_isContainerPrepared = true ;
DataGridContext gridContext = DataGridControl . GetDataGridContext ( this ) ;
}
if ( gridContext ! = null )
protected virtual void ClearContainer ( )
{
object dataItem = gridContext . GetItemFromContainer ( this ) ;
if ( dataItem ! = null )
{
{
group = gridContext . GetGroupFromItem ( dataItem ) ;
m_itemContainerManager . Clear ( m_isRecyclingCandidate ) ;
m_isContainerPrepared = false ;
}
}
}
this . SetGroup ( group ) ;
m_itemContainerManager . Prepare ( gridContext , item ) ;
protected internal virtual void PrepareDefaultStyleKey ( Xceed . Wpf . DataGrid . Views . ViewBase view )
{
m_isContainerPrepared = true ;
this . DefaultStyleKey = view . GetDefaultStyleKey ( typeof ( GroupHeaderControl ) ) ;
}
}
protected virtual void ClearContainer ( )
protected internal virtual bool ShouldHandleSelectionEvent ( InputEventArgs eventArgs )
{
{
m_itemContainerManager . Clear ( m_isRecyclingCandidate ) ;
var targetChild = eventArgs . OriginalSource as DependencyObject ;
m_isContainerPrepared = false ;
}
protected internal virtual void PrepareDefaultStyleKey ( Xceed . Wpf . DataGrid . Views . ViewBase view )
// If the event is comming from a specific control inside the header (GroupNavigationControl or Collapsed button),
{
// ignore the event since it is not for selection purposes that the user targeted this control.
this . DefaultStyleKey = view . GetDefaultStyleKey ( typeof ( GroupHeaderControl ) ) ;
var collapsedButtonParent = TreeHelper . FindParent < ToggleButton > ( targetChild , true , null , this ) ;
}
if ( collapsedButtonParent ! = null )
return false ;
protected internal virtual bool ShouldHandleSelectionEvent ( InputEventArgs eventArgs )
var groupNavigationControlParent = TreeHelper . FindParent < GroupNavigationControl > ( targetChild , true , null , this ) ;
{
if ( groupNavigationControlParent ! = null )
var targetChild = eventArgs . OriginalSource as DependencyObject ;
return false ;
// If the event is comming from a specific control inside the header (GroupNavigationControl or Collapsed button),
return true ;
// ignore the event since it is not for selection purposes that the user targeted this control.
}
var collapsedButtonParent = TreeHelper . FindParent < ToggleButton > ( targetChild , true , null , this ) ;
if ( collapsedButtonParent ! = null )
return false ;
var groupNavigationControlParent = TreeHelper . FindParent < GroupNavigationControl > ( targetChild , true , null , this ) ;
private static void OnParentGridControlChanged ( DependencyObject sender , DependencyPropertyChangedEventArgs e )
if ( groupNavigationControlParent ! = null )
{
return false ;
DataGridControl grid = e . NewValue as DataGridControl ;
GroupHeaderControl groupHeaderControl = sender as GroupHeaderControl ;
return true ;
if ( ( groupHeaderControl ! = null ) & & ( grid ! = null ) )
}
{
groupHeaderControl . PrepareDefaultStyleKey ( grid . GetView ( ) ) ;
}
}
private static void OnParentGridControlChanged ( DependencyObject sender , DependencyPropertyChangedEventArgs e )
private void OnExpandCanExecute ( object sender , CanExecuteRoutedEventArgs e )
{
{
DataGridControl grid = e . NewValue as DataGridControl ;
e . CanExecute = false ;
GroupHeaderControl groupHeaderControl = sender as GroupHeaderControl ;
if ( ( groupHeaderControl ! = null ) & & ( grid ! = null ) )
if ( e . Parameter = = null )
{
{
groupHeaderControl . PrepareDefaultStyleKey ( grid . GetView ( ) ) ;
//can execute the Expand command if the group is NOT expanded.
}
e . CanExecute = ! this . FindGroupCommandTarget ( e . OriginalSource ) . IsExpanded ;
}
}
}
private void OnExpandCanExecute ( object sender , CanExecuteRoutedEventArgs e )
private void OnExpandExecuted ( object sender , ExecutedRoutedEventArgs e )
{
{
e . CanExecute = false ;
this . FindGroupCommandTarget ( e . OriginalSource ) . IsExpanded = true ;
}
if ( e . Parameter = = null )
private void OnCollapseCanExecute ( object sender , CanExecuteRoutedEventArgs e )
{
{
//can execute the Expand command if the group is NOT expanded.
e . CanExecute = false ;
e . CanExecute = ! this . FindGroupCommandTarget ( e . OriginalSource ) . IsExpanded ;
}
}
private void OnExpandExecuted ( object sender , ExecutedRoutedEventArgs e )
if ( e . Parameter = = null )
{
{
this . FindGroupCommandTarget ( e . OriginalSource ) . IsExpanded = true ;
//can execute the Collapse command if the group is expanded.
}
e . CanExecute = this . FindGroupCommandTarget ( e . OriginalSource ) . IsExpanded ;
}
}
private void OnCollapseCanExecute ( object sender , CanExecuteRoutedEventArgs e )
private void OnCollapseExecuted ( object sender , ExecutedRoutedEventArgs e )
{
{
e . CanExecute = false ;
this . FindGroupCommandTarget ( e . OriginalSource ) . IsExpanded = false ;
}
if ( e . Parameter = = null )
private void OnToggleCanExecute ( object sender , CanExecuteRoutedEventArgs e )
{
{
//can execute the Collapse command if the group is expanded.
e . CanExecute = false ;
e . CanExecute = this . FindGroupCommandTarget ( e . OriginalSource ) . IsExpanded ;
}
}
private void OnCollapseExecuted ( object sender , ExecutedRoutedEventArgs e )
if ( e . Parameter = = null )
{
{
this . FindGroupCommandTarget ( e . OriginalSource ) . IsExpanded = false ;
e . CanExecute = true ; //can always toggle
}
}
}
private void OnToggleCan Execute ( object sender , Can ExecuteRoutedEventArgs e )
private void OnToggleExecuted ( object sender , Executed RoutedEventArgs e )
{
{
e . CanExecute = false ;
Group group = FindGroupCommandTarget ( e . OriginalSource ) ;
if ( e . Parameter = = null )
group . IsExpanded = ! group . IsExpanded ;
{
}
e . CanExecute = true ; //can always toggle
}
}
private void OnToggleExecuted ( object sender , ExecutedRoutedEventArgs e )
// We use an ItemsControl inside the GroupHeaderControl to represent the
{
// ancestors (ParentGroups) of this.Group, and each item in this ItemsControl
Group group = FindGroupCommandTarget ( e . OriginalSource ) ;
// is a Group templated to look like a single, stand-alone GroupHeaderControl.
//
// In the ItemTemplate for each Group in the ItemsControl, we have a Border that
// declares some InputBindings to the group commands. In this case, we want to
// execute the command on this specific instance of Group, which is the DataContext
// of the Border.
private Group FindGroupCommandTarget ( object originalSource )
{
object dataContext = null ;
group . IsExpanded = ! group . IsExpanded ;
FrameworkElement fe = originalSource as FrameworkElement ;
}
if ( fe ! = null )
{
dataContext = fe . DataContext ;
}
else
{
FrameworkContentElement fce = originalSource as FrameworkContentElement ;
if ( fce ! = null )
{
dataContext = fce . DataContext ;
}
}
// We use an ItemsControl inside the GroupHeaderControl to represent the
Group groupCommandTarget = dataContext as Group ;
// ancestors (ParentGroups) of this.Group, and each item in this ItemsControl
// is a Group templated to look like a single, stand-alone GroupHeaderControl.
//
// In the ItemTemplate for each Group in the ItemsControl, we have a Border that
// declares some InputBindings to the group commands. In this case, we want to
// execute the command on this specific instance of Group, which is the DataContext
// of the Border.
private Group FindGroupCommandTarget ( object originalSource )
{
object dataContext = null ;
FrameworkElement fe = originalSource as FrameworkElement ;
return ( groupCommandTarget ! = null ) ? groupCommandTarget : this . Group ;
if ( fe ! = null )
{
dataContext = fe . DataContext ;
}
else
{
FrameworkContentElement fce = originalSource as FrameworkContentElement ;
if ( fce ! = null )
{
dataContext = fce . DataContext ;
}
}
}
Group groupCommandTarget = dataContext as Group ;
#region INotifyPropertyChanged Members
return ( groupCommandTarget ! = null ) ? groupCommandTarget : this . Group ;
public event PropertyChangedEventHandler PropertyChanged ;
}
#region INotifyPropertyChanged Members
private void RaisePropertyChanged ( string propertyName )
{
var handler = this . PropertyChanged ;
if ( handler = = null )
return ;
public event PropertyChangedEventHandler PropertyChanged ;
handler . Invoke ( this , new PropertyChangedEventArgs ( propertyName ) ) ;
}
private void RaisePropertyChanged ( string propertyName )
#endregion
{
var handler = this . PropertyChanged ;
if ( handler = = null )
return ;
handler . Invoke ( this , new PropertyChangedEventArgs ( propertyName ) ) ;
#region IDataGridItemContainer Members
}
#endregion
bool IDataGridItemContainer . CanBeRecycled
{
get
{
return this . CanBeRecycled ;
}
}
#region IDataGridItemContainer Members
bool IDataGridItemContainer . IsRecyclingCandidate
{
get
{
return m_isRecyclingCandidate ;
}
set
{
m_isRecyclingCandidate = value ;
}
}
bool IDataGridItemContainer . CanBeRecycled
void IDataGridItemContainer . PrepareContainer ( DataGridContext dataGridContext , object item )
{
{
get
this . PrepareContainer ( dataGridContext , item ) ;
{
}
return this . CanBeRecycled ;
}
}
bool IDataGridItemContainer . IsRecyclingCandidate
void IDataGridItemContainer . ClearContainer ( )
{
{
get
this . ClearContainer ( ) ;
{
}
return m_isRecyclingCandidate ;
}
set
{
m_isRecyclingCandidate = value ;
}
}
void IDataGridItemContainer . PrepareContainer ( DataGridContext dataGridContext , object item )
void IDataGridItemContainer . CleanRecyclingCandidate ( )
{
{
this . PrepareContainer ( dataGridContext , item ) ;
m_itemContainerManager . CleanRecyclingCandidates ( ) ;
}
}
void IDataGridItemContainer . ClearContainer ( )
#endregion
{
this . ClearContainer ( ) ;
}
void IDataGridItemContainer . CleanRecyclingCandidate ( )
private readonly DataGridItemContainerManager m_itemContainerManager ;
{
private bool m_isContainerPrepared ;
m_itemContainerManager . CleanRecyclingCandidates ( ) ;
private bool m_isRecyclingCandidate ;
}
}
#endregion
private readonly DataGridItemContainerManager m_itemContainerManager ;
private bool m_isContainerPrepared ;
private bool m_isRecyclingCandidate ;
}
}
}