From c453ad3b36aeedad23bb4c3205456bc460c412e9 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 25 Jul 2015 21:26:41 +0200 Subject: [PATCH] Removed Scrollbar binding workaround. Binding system now handles this. Added unit tests to ensure it works property. --- Perspex.Controls/Primitives/ScrollBar.cs | 15 --- Perspex.Themes.Default/ScrollBarStyle.cs | 9 +- .../Perspex.Controls.UnitTests.csproj | 1 + .../Primitives/RangeBaseTests.cs | 2 +- .../Primitives/ScrollBarTests.cs | 92 +++++++++++++++++++ 5 files changed, 99 insertions(+), 20 deletions(-) create mode 100644 Tests/Perspex.Controls.UnitTests/Primitives/ScrollBarTests.cs diff --git a/Perspex.Controls/Primitives/ScrollBar.cs b/Perspex.Controls/Primitives/ScrollBar.cs index 6b10ef6b1c..8c7d869531 100644 --- a/Perspex.Controls/Primitives/ScrollBar.cs +++ b/Perspex.Controls/Primitives/ScrollBar.cs @@ -82,21 +82,6 @@ namespace Perspex.Controls.Primitives return base.MeasureOverride(availableSize); } - /// - protected override void OnTemplateApplied() - { - base.OnTemplateApplied(); - - // Binding between this.Value and track.Value must be done explicitly like this rather - // than using standard bindings as it shouldn't be able to to be overridden by binding - // e.g. ScrollBar.Value. - // TODO: This is probably no longer true. Test and use a standard 2 way binding if - // possible. - var track = this.GetTemplateChild("track"); - track.GetObservable(ValueProperty).Subscribe(x => this.Value = x); - this.GetObservable(ValueProperty).Subscribe(x => track.Value = x); - } - /// /// Calculates whether the scrollbar should be visible. /// diff --git a/Perspex.Themes.Default/ScrollBarStyle.cs b/Perspex.Themes.Default/ScrollBarStyle.cs index 546e1cca93..9c9c22fa0b 100644 --- a/Perspex.Themes.Default/ScrollBarStyle.cs +++ b/Perspex.Themes.Default/ScrollBarStyle.cs @@ -67,10 +67,11 @@ namespace Perspex.Themes.Default Child = new Track { Name = "track", - [~Track.MinimumProperty] = control[~ScrollBar.MinimumProperty], - [~Track.MaximumProperty] = control[~ScrollBar.MaximumProperty], - [~Track.ViewportSizeProperty] = control[~ScrollBar.ViewportSizeProperty], - [~Track.OrientationProperty] = control[~ScrollBar.OrientationProperty], + [!Track.MinimumProperty] = control[!ScrollBar.MinimumProperty], + [!Track.MaximumProperty] = control[!ScrollBar.MaximumProperty], + [!!Track.ValueProperty] = control[!!ScrollBar.ValueProperty], + [!Track.ViewportSizeProperty] = control[!ScrollBar.ViewportSizeProperty], + [!Track.OrientationProperty] = control[!ScrollBar.OrientationProperty], Thumb = new Thumb { Name = "thumb", diff --git a/Tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj b/Tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj index 70462294bf..34b970ffe1 100644 --- a/Tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj +++ b/Tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj @@ -96,6 +96,7 @@ + diff --git a/Tests/Perspex.Controls.UnitTests/Primitives/RangeBaseTests.cs b/Tests/Perspex.Controls.UnitTests/Primitives/RangeBaseTests.cs index 1956f3f22e..b66c9059f6 100644 --- a/Tests/Perspex.Controls.UnitTests/Primitives/RangeBaseTests.cs +++ b/Tests/Perspex.Controls.UnitTests/Primitives/RangeBaseTests.cs @@ -6,8 +6,8 @@ namespace Perspex.Controls.UnitTests.Primitives { - using Perspex.Controls.Primitives; using System; + using Perspex.Controls.Primitives; using Xunit; public class RangeBaseTests diff --git a/Tests/Perspex.Controls.UnitTests/Primitives/ScrollBarTests.cs b/Tests/Perspex.Controls.UnitTests/Primitives/ScrollBarTests.cs new file mode 100644 index 0000000000..6d0e904427 --- /dev/null +++ b/Tests/Perspex.Controls.UnitTests/Primitives/ScrollBarTests.cs @@ -0,0 +1,92 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2015 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Controls.UnitTests.Primitives +{ + using System; + using Perspex.Controls.Primitives; + using Perspex.Controls.Templates; + using Perspex.Media; + using Xunit; + + public class ScrollBarTests + { + [Fact] + public void Setting_Value_Should_Update_Track_Value() + { + var target = new ScrollBar + { + Template = ControlTemplate.Create(Template), + }; + + target.ApplyTemplate(); + var track = target.GetTemplateChild("track"); + target.Value = 50; + + Assert.Equal(track.Value, 50); + } + + [Fact] + public void Setting_Track_Value_Should_Update_Value() + { + var target = new ScrollBar + { + Template = ControlTemplate.Create(Template), + }; + + target.ApplyTemplate(); + var track = target.GetTemplateChild("track"); + track.Value = 50; + + Assert.Equal(target.Value, 50); + } + + [Fact] + public void Setting_Track_Value_After_Setting_Value_Should_Update_Value() + { + var target = new ScrollBar + { + Template = ControlTemplate.Create(Template), + }; + + target.ApplyTemplate(); + + var track = target.GetTemplateChild("track"); + target.Value = 25; + track.Value = 50; + + Assert.Equal(target.Value, 50); + } + + private static Control Template(ScrollBar control) + { + return new Border + { + Child = new Track + { + Name = "track", + [!Track.MinimumProperty] = control[!ScrollBar.MinimumProperty], + [!Track.MaximumProperty] = control[!ScrollBar.MaximumProperty], + [!!Track.ValueProperty] = control[!!ScrollBar.ValueProperty], + [!Track.ViewportSizeProperty] = control[!ScrollBar.ViewportSizeProperty], + [!Track.OrientationProperty] = control[!ScrollBar.OrientationProperty], + Thumb = new Thumb + { + Template = ControlTemplate.Create(ThumbTemplate), + }, + }, + }; + } + + private static Control ThumbTemplate(Thumb control) + { + return new Border + { + Background = Brushes.Gray, + }; + } + } +} \ No newline at end of file