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 = @"
+
+
+
+
+
+
+";
+ var loader = new AvaloniaXamlLoader();
+ var window = (Window)loader.Load(xaml);
+ var button = window.FindControl