Created
April 2, 2019 19:40
-
-
Save sjoshua270/6933e79853bf894ff70d6dd88eee0776 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class TreeViewItemViewModel : INotifyPropertyChanged | |
{ | |
#region Data | |
static readonly TreeViewItemViewModel DummyChild = new TreeViewItemViewModel(); | |
readonly ObservableCollection<TreeViewItemViewModel> _children; | |
readonly TreeViewItemViewModel _parent; | |
bool _isExpanded; | |
bool _isSelected; | |
#endregion // Data | |
#region Constructors | |
protected TreeViewItemViewModel(TreeViewItemViewModel parent, bool lazyLoadChildren) | |
{ | |
_parent = parent; | |
_children = new ObservableCollection<TreeViewItemViewModel>(); | |
if (lazyLoadChildren) | |
_children.Add(DummyChild); | |
} | |
// This is used to create the DummyChild instance. | |
private TreeViewItemViewModel() | |
{ | |
} | |
#endregion // Constructors | |
#region Presentation Members | |
#region Children | |
/// <summary> | |
/// Returns the logical child items of this object. | |
/// </summary> | |
public ObservableCollection<TreeViewItemViewModel> Children | |
{ | |
get { return _children; } | |
} | |
#endregion // Children | |
#region HasLoadedChildren | |
public bool HasLoadedChildren | |
{ | |
get { return !HasDummyChild; } | |
} | |
/// <summary> | |
/// Returns true if this object's Children have not yet been populated. | |
/// </summary> | |
public bool HasDummyChild | |
{ | |
get { return Children.Count == 1 && Children[0] == DummyChild; } | |
} | |
#endregion // HasLoadedChildren | |
#region IsExpanded | |
/// <summary> | |
/// Gets/sets whether the TreeViewItem | |
/// associated with this object is expanded. | |
/// </summary> | |
public bool IsExpanded | |
{ | |
get { return _isExpanded; } | |
set | |
{ | |
if (value != _isExpanded) | |
{ | |
_isExpanded = value; | |
OnPropertyChanged("IsExpanded"); | |
} | |
// Expand all the way up to the root. | |
if (_isExpanded && _parent != null) | |
_parent.IsExpanded = true; | |
// Lazy load the child items, if necessary. | |
if (HasDummyChild) | |
{ | |
Children.Remove(DummyChild); | |
LoadChildren(); | |
} | |
} | |
} | |
#endregion // IsExpanded | |
#region IsSelected | |
/// <summary> | |
/// Gets/sets whether the TreeViewItem | |
/// associated with this object is selected. | |
/// </summary> | |
public bool IsSelected | |
{ | |
get { return _isSelected; } | |
set | |
{ | |
if (value != _isSelected) | |
{ | |
_isSelected = value; | |
OnPropertyChanged("IsSelected"); | |
} | |
SelectOU(); | |
} | |
} | |
#endregion // IsSelected | |
#region LoadChildren | |
/// <summary> | |
/// Invoked when the child items need to be loaded on demand. | |
/// Subclasses can override this to populate the Children collection. | |
/// </summary> | |
protected virtual void LoadChildren() | |
{ | |
} | |
#endregion // LoadChildren | |
#region SelectOU | |
/// <summary> | |
/// Invoked when the item is selected. | |
/// Subclasses can override this to react to the selection. | |
/// </summary> | |
protected virtual void SelectOU() | |
{ | |
} | |
#endregion // SelectOU | |
#region Parent | |
public TreeViewItemViewModel Parent | |
{ | |
get { return _parent; } | |
} | |
#endregion // Parent | |
#endregion // Presentation Members | |
#region INotifyPropertyChanged Members | |
public event PropertyChangedEventHandler PropertyChanged; | |
protected virtual void OnPropertyChanged(string propertyName) | |
{ | |
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); | |
} | |
#endregion // INotifyPropertyChanged Members | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment