文件路径选择中的三态逻辑,效果图如下:
代码如下:
private bool? _isChecked = false;
/// <summary>
/// 是否已选择
/// </summary>
public bool? IsChecked
{
get { return _isChecked; }
set
{
if (value != null)
{
SetIsChecked(SetIsCheckedDirection.Both, value);
}
else if (value == null && this.IsFolder)
{
//文件夹选择为空的情况处理
SetIsChecked(SetIsCheckedDirection.Both, !_isChecked);
}
}
}
public void SetIsChecked(SetIsCheckedDirection direction, bool? isChecked)
{
this._isChecked = isChecked;
this.OnPropertyChanged("IsChecked");
if ((direction & SetIsCheckedDirection.Children) == SetIsCheckedDirection.Children)
{
if (isChecked != null)
{
foreach (var child in this.Children)
{
child.SetIsChecked(SetIsCheckedDirection.Children, isChecked);
}
}
}
if ((direction & SetIsCheckedDirection.Parent) == SetIsCheckedDirection.Parent)
{
if (this.Parent != null && this.Parent.Children != null)
{
if (this.Parent.Children.All(i => i.IsChecked == true))
{this.Parent.SetIsChecked(SetIsCheckedDirection.Parent, true);
}
else if (this.Parent.Children.All(i => i.IsChecked == false))
{this.Parent.SetIsChecked(SetIsCheckedDirection.Parent, false);
}
else
{this.Parent.SetIsChecked(SetIsCheckedDirection.Parent, null);
}
}
}
}