diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs index c3229d814c..0f8c654a8b 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs @@ -88,18 +88,26 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions { result.Path = string.Empty; } - else if (path.StartsWith("#")) + else if (path.StartsWith("!")) + { + int pathStart = 0; + for (; pathStart < path.Length && path[pathStart] == '!'; ++pathStart); + result.Path = path.Substring(0, pathStart); + path = path.Substring(pathStart); + } + + if (path.StartsWith("#")) { var dot = path.IndexOf('.'); if (dot != -1) { - result.Path = path.Substring(dot + 1); + result.Path += path.Substring(dot + 1); result.ElementName = path.Substring(1, dot - 1); } else { - result.Path = string.Empty; + result.Path += string.Empty; result.ElementName = path.Substring(1); } } @@ -114,12 +122,12 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions string relativeSourceMode; if (dot != -1) { - result.Path = path.Substring(dot + 1); + result.Path += path.Substring(dot + 1); relativeSourceMode = path.Substring(1, dot - 1); } else { - result.Path = string.Empty; + result.Path += string.Empty; relativeSourceMode = path.Substring(1); } @@ -170,7 +178,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions } else { - result.Path = path; + result.Path += path; } return result; @@ -229,4 +237,4 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions public RelativeSource RelativeSource { get; set; } } -} \ No newline at end of file +} diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests_RelativeSource.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests_RelativeSource.cs index 095aae7742..c6fe79bc0c 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests_RelativeSource.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests_RelativeSource.cs @@ -297,7 +297,60 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml Assert.Equal("title", button.Content); } } + + [Fact] + public void Shorthand_Binding_With_Negation_Works() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var xaml = @" + + + +