diff --git a/src/Avalonia.Controls/Primitives/ToggleButton.cs b/src/Avalonia.Controls/Primitives/ToggleButton.cs index dc9b70ab8c..1d2e2f2100 100644 --- a/src/Avalonia.Controls/Primitives/ToggleButton.cs +++ b/src/Avalonia.Controls/Primitives/ToggleButton.cs @@ -14,7 +14,7 @@ namespace Avalonia.Controls.Primitives nameof(IsChecked), o => o.IsChecked, (o, v) => o.IsChecked = v, - unsetValue: false, + unsetValue: null, defaultBindingMode: BindingMode.TwoWay); public static readonly StyledProperty IsThreeStateProperty = diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/ToggleButtonTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/ToggleButtonTests.cs index ab74d5e7d6..4f4ab47b0a 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/ToggleButtonTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/ToggleButtonTests.cs @@ -44,15 +44,41 @@ namespace Avalonia.Controls.Primitives.UnitTests Assert.False(toggleButton.IsChecked); } + [Fact] + public void ToggleButton_ThreeState_Checked_Binds_To_Nullable_Bool() + { + var threeStateButton = new ToggleButton(); + var source = new Class1(); + + threeStateButton.DataContext = source; + threeStateButton.Bind(ToggleButton.IsCheckedProperty, new Binding(nameof(Class1.NullableFoo))); + + source.NullableFoo = true; + Assert.True(threeStateButton.IsChecked); + + source.NullableFoo = false; + Assert.False(threeStateButton.IsChecked); + + source.NullableFoo = null; + Assert.Null(threeStateButton.IsChecked); + } + private class Class1 : NotifyingBase { private bool _foo; + private bool? nullableFoo; public bool Foo { get { return _foo; } set { _foo = value; RaisePropertyChanged(); } } + + public bool? NullableFoo + { + get { return nullableFoo; } + set { nullableFoo = value; RaisePropertyChanged(); } + } } } }