Browse Source

Only enable data validation for LocalValue bindings.

Steven Kirk 9 years ago
parent
commit
b063ddf872

+ 1 - 0
src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs

@@ -91,6 +91,7 @@ namespace Avalonia.Markup.Xaml.Data
 
             var pathInfo = ParsePath(Path);
             ValidateState(pathInfo);
+            enableDataValidation = enableDataValidation && Priority == BindingPriority.LocalValue;
 
             ExpressionObserver observer;
 

+ 1 - 0
tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj

@@ -93,6 +93,7 @@
   </Choose>
   <ItemGroup>
     <Compile Include="Context\AvaloniaNamespaceRegistryTest.cs" />
+    <Compile Include="Data\BindingTests_DataValidation.cs" />
     <Compile Include="Data\BindingTests_Source.cs" />
     <Compile Include="Data\BindingTests_ElementName.cs" />
     <Compile Include="Data\MultiBindingTests.cs" />

+ 79 - 0
tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_DataValidation.cs

@@ -0,0 +1,79 @@
+// Copyright (c) The Avalonia Project. All rights reserved.
+// Licensed under the MIT license. See licence.md file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reactive.Linq;
+using Avalonia.Controls;
+using Avalonia.Data;
+using Avalonia.Markup.Data;
+using Avalonia.Markup.Xaml.Data;
+using Moq;
+using ReactiveUI;
+using Xunit;
+
+namespace Avalonia.Markup.Xaml.UnitTests.Data
+{
+    public class BindingTests_DataValidation
+    {
+        [Fact]
+        public void Initiate_Should_Not_Enable_Data_Validation_With_BindingPriority_LocalValue()
+        {
+            var textBlock = new TextBlock
+            {
+                DataContext = new Class1(),
+            };
+
+            var target = new Binding(nameof(Class1.Foo));
+            var instanced = target.Initiate(textBlock, TextBlock.TextProperty, enableDataValidation: false);
+            var subject = (ExpressionSubject)instanced.Subject;
+            object result = null;
+
+            subject.Subscribe(x => result = x);
+
+            Assert.IsType<string>(result);
+        }
+
+        [Fact]
+        public void Initiate_Should_Enable_Data_Validation_With_BindingPriority_LocalValue()
+        {
+            var textBlock = new TextBlock
+            {
+                DataContext = new Class1(),
+            };
+
+            var target = new Binding(nameof(Class1.Foo));
+            var instanced = target.Initiate(textBlock, TextBlock.TextProperty, enableDataValidation: true);
+            var subject = (ExpressionSubject)instanced.Subject;
+            object result = null;
+
+            subject.Subscribe(x => result = x);
+
+            Assert.Equal(new BindingNotification("foo"), result);
+        }
+
+        [Fact]
+        public void Initiate_Should_Not_Enable_Data_Validation_With_BindingPriority_TemplatedParent()
+        {
+            var textBlock = new TextBlock
+            {
+                DataContext = new Class1(),
+            };
+
+            var target = new Binding(nameof(Class1.Foo)) { Priority = BindingPriority.TemplatedParent };
+            var instanced = target.Initiate(textBlock, TextBlock.TextProperty, enableDataValidation: true);
+            var subject = (ExpressionSubject)instanced.Subject;
+            object result = null;
+
+            subject.Subscribe(x => result = x);
+
+            Assert.IsType<string>(result);
+        }
+
+        private class Class1
+        {
+            public string Foo { get; set; } = "foo";
+        }
+    }
+}