diff --git a/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs b/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs index 87b4772d0a..6b8b1282e5 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs +++ b/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; diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj index cff81b708a..3ab344c24e 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj @@ -93,6 +93,7 @@ + diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_DataValidation.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_DataValidation.cs new file mode 100644 index 0000000000..4f175ccf5b --- /dev/null +++ b/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(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(result); + } + + private class Class1 + { + public string Foo { get; set; } = "foo"; + } + } +}