From 6a84b84b5577adf1f7b87858c67fd73da0649e4d Mon Sep 17 00:00:00 2001 From: Simon Rozsival Date: Wed, 9 Oct 2024 11:27:49 +0200 Subject: [PATCH 1/3] Add test --- .../Xaml.UnitTests/Issues/Maui25141.xaml | 43 ++++++++++ .../Xaml.UnitTests/Issues/Maui25141.xaml.cs | 86 +++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 src/Controls/tests/Xaml.UnitTests/Issues/Maui25141.xaml create mode 100644 src/Controls/tests/Xaml.UnitTests/Issues/Maui25141.xaml.cs diff --git a/src/Controls/tests/Xaml.UnitTests/Issues/Maui25141.xaml b/src/Controls/tests/Xaml.UnitTests/Issues/Maui25141.xaml new file mode 100644 index 000000000000..23cbe4a461aa --- /dev/null +++ b/src/Controls/tests/Xaml.UnitTests/Issues/Maui25141.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Controls/tests/Xaml.UnitTests/Issues/Maui25141.xaml.cs b/src/Controls/tests/Xaml.UnitTests/Issues/Maui25141.xaml.cs new file mode 100644 index 000000000000..73fce3887e61 --- /dev/null +++ b/src/Controls/tests/Xaml.UnitTests/Issues/Maui25141.xaml.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using Microsoft.Maui.ApplicationModel; +using Microsoft.Maui.Controls.Core.UnitTests; +using Microsoft.Maui.Controls.Shapes; +using Microsoft.Maui.Devices; +using Microsoft.Maui.Dispatching; + +using Microsoft.Maui.Graphics; +using Microsoft.Maui.UnitTests; +using NUnit.Framework; + +namespace Microsoft.Maui.Controls.Xaml.UnitTests; + +[XamlCompilation(XamlCompilationOptions.Skip)] +public partial class Maui25141 : ContentPage +{ + public Maui25141() + { + InitializeComponent(); + BindingContext = new Maui25141ViewModel + { + Text = "Hello, Maui!", + TriggerFlag = true + }; + } + + public Maui25141(bool useCompiledXaml) + { + //this stub will be replaced at compile time + } + + [TestFixture] + class Test + { + [SetUp] + public void Setup() + { + Application.SetCurrentApplication(new MockApplication()); + DispatcherProvider.SetCurrent(new DispatcherProviderStub()); + } + + [TearDown] public void TearDown() + { + AppInfo.SetCurrent(null); + DeviceInfo.SetCurrent(null); + } + + [Test] + public void BindingsInDataTriggerAndMultiBindingAreCompiledCorrectly() + { + MockCompiler.Compile(typeof(Maui25141), treatWarningsAsErrors: true); + } + } +} + +public class Maui25141ViewModel : INotifyPropertyChanged +{ + private bool _triggerFlag; + public bool TriggerFlag + { + get => _triggerFlag; + set + { + _triggerFlag = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TriggerFlag))); + } + } + + private string _text; + public string Text + { + get => _text; + set + { + _text = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Text))); + } + } + + public event PropertyChangedEventHandler PropertyChanged; +} From 2bceb71b9366368d29745ef03bb3949174174d8d Mon Sep 17 00:00:00 2001 From: Simon Rozsival Date: Wed, 9 Oct 2024 14:06:26 +0200 Subject: [PATCH 2/3] Remove the restriction to inherit x:DataType from parent scope for standalone bindings --- src/Controls/src/Build.Tasks/SetPropertiesVisitor.cs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/Controls/src/Build.Tasks/SetPropertiesVisitor.cs b/src/Controls/src/Build.Tasks/SetPropertiesVisitor.cs index b823f24dc347..6a34134afa25 100644 --- a/src/Controls/src/Build.Tasks/SetPropertiesVisitor.cs +++ b/src/Controls/src/Build.Tasks/SetPropertiesVisitor.cs @@ -305,7 +305,7 @@ public static IEnumerable ProvideValue(VariableDefinitionReference bool skipBindingCompilation = hasSource && !context.CompileBindingsWithSource; if (!skipBindingCompilation) { - if (TryCompileBindingPath(node, context, vardefref.VariableDefinition, bindingExtensionType.Value, isStandaloneBinding: bpRef is null, out var instructions)) + if (TryCompileBindingPath(node, context, vardefref.VariableDefinition, bindingExtensionType.Value, out var instructions)) { foreach (var instruction in instructions) yield return instruction; @@ -421,7 +421,7 @@ public static IEnumerable ProvideValue(VariableDefinitionReference } //Once we get compiled IValueProvider, this will move to the BindingExpression - static bool TryCompileBindingPath(ElementNode node, ILContext context, VariableDefinition bindingExt, (string, string, string) bindingExtensionType, bool isStandaloneBinding, out IEnumerable instructions) + static bool TryCompileBindingPath(ElementNode node, ILContext context, VariableDefinition bindingExt, (string, string, string) bindingExtensionType, out IEnumerable instructions) { instructions = null; @@ -456,13 +456,6 @@ static bool TryCompileBindingPath(ElementNode node, ILContext context, VariableD { break; } - else if (isStandaloneBinding) - { - // For standalone bindings we don't allow inheriting the x:DataType from its parents. - // A standalone binding is a binding instance which is not immediately applied through `SetBinding(...)` - // but it is applied later (for example it is applied to items in a collection). - break; - } if (n.XmlType.Name == nameof(Microsoft.Maui.Controls.DataTemplate) && n.XmlType.NamespaceUri == XamlParser.MauiUri) From 54150a15f6f3b3ef0eb526fca1075fc72e0b4c9f Mon Sep 17 00:00:00 2001 From: Simon Rozsival Date: Thu, 10 Oct 2024 11:23:35 +0200 Subject: [PATCH 3/3] Update expected error code --- src/Controls/tests/Xaml.UnitTests/Issues/Maui23989.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controls/tests/Xaml.UnitTests/Issues/Maui23989.xaml.cs b/src/Controls/tests/Xaml.UnitTests/Issues/Maui23989.xaml.cs index a544ed6625ba..b3dab5efdd6d 100644 --- a/src/Controls/tests/Xaml.UnitTests/Issues/Maui23989.xaml.cs +++ b/src/Controls/tests/Xaml.UnitTests/Issues/Maui23989.xaml.cs @@ -38,7 +38,7 @@ public void Setup() public void ItemDisplayBindingWithoutDataTypeFails([Values(false, true)] bool useCompiledXaml) { if (useCompiledXaml) - Assert.Throws(new BuildExceptionConstraint(12, 13, s => s.Contains("0022", StringComparison.Ordinal)), ()=> MockCompiler.Compile(typeof(Maui23989), null, true)); + Assert.Throws(new BuildExceptionConstraint(12, 13, s => s.Contains("0045", StringComparison.Ordinal)), ()=> MockCompiler.Compile(typeof(Maui23989), null, true)); var layout = new Maui23989(useCompiledXaml); //without x:DataType, bindings aren't compiled