private void OnChildCheckedChanged(bool?oldValue, bool?newValue) { switch (oldValue) { case null: Interlocked.Decrement(ref _unknownCount); break; case true: Interlocked.Decrement(ref _checkedCount); break; } switch (newValue) { case null: Interlocked.Increment(ref _unknownCount); break; case true: Interlocked.Increment(ref _checkedCount); break; } _checkedChanger = CheckedChanger.Child; try { if (_unknownCount > 0) { IsChecked = null; } else if (_checkedCount > 0) { IsChecked = _checkedCount == GetChilds().Length ? (bool?)true : null; } else { IsChecked = false; } } finally { _checkedChanger = CheckedChanger.Manual; } }
private void OnChildCheckedChanged(bool? oldValue, bool? newValue) { switch (oldValue) { case null: Interlocked.Decrement(ref _unknownCount); break; case true: Interlocked.Decrement(ref _checkedCount); break; } switch (newValue) { case null: Interlocked.Increment(ref _unknownCount); break; case true: Interlocked.Increment(ref _checkedCount); break; } _checkedChanger = CheckedChanger.Child; try { if (_unknownCount > 0) IsChecked = null; else if (_checkedCount > 0) IsChecked = _checkedCount == GetChilds().Length ? (bool?)true : null; else IsChecked = false; } finally { _checkedChanger = CheckedChanger.Manual; } }