浏览代码

Merge pull request #3348 from pr8x/fix-TargetNullValue-xaml

Adding TargetNullValue to BindingExtension
Dariusz Komosiński 6 年之前
父节点
当前提交
a7ebcf89fe

+ 3 - 0
src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs

@@ -41,6 +41,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
                 StringFormat = StringFormat,
                 RelativeSource = RelativeSource,
                 DefaultAnchor = new WeakReference(GetDefaultAnchor(descriptorContext)),
+                TargetNullValue = TargetNullValue,
                 NameScope = new WeakReference<INameScope>(serviceProvider.GetService<INameScope>())
             };
         }
@@ -86,5 +87,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
         public string StringFormat { get; set; }
 
         public RelativeSource RelativeSource { get; set; }
+        
+        public object TargetNullValue { get; set; }
     }
 }

+ 31 - 0
tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/BindingExtensionTests.cs

@@ -38,6 +38,37 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions
                 Assert.Equal("foobar", textBlock.Text);
             }
         }
+        
+        [Fact]
+        public void BindingExtension_Binds_To_TargetNullValue()
+        {
+            using (StyledWindow())
+            {
+                var xaml = @"
+<Window xmlns='https://github.com/avaloniaui'
+             xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
+    <Window.Resources>
+        <x:String x:Key='text'>foobar</x:String>
+    </Window.Resources>
+
+    <TextBlock Name='textBlock' Text='{Binding Foo, TargetNullValue={StaticResource text}}'/>
+</Window>";
+
+                var loader = new AvaloniaXamlLoader();
+                var window = (Window)loader.Load(xaml);
+                var textBlock = window.FindControl<TextBlock>("textBlock");
+
+                window.DataContext = new FooBar();
+                window.Show();
+
+                Assert.Equal("foobar", textBlock.Text);
+            }
+        }
+
+        private class FooBar
+        {
+            public object Foo { get; } = null;
+        }
 
         private IDisposable StyledWindow(params (string, string)[] assets)
         {