using System; using Avalonia.Controls; using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; using Avalonia.Styling; using Avalonia.UnitTests; using Xunit; namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions { public class BindingExtensionTests : XamlTestBase { [Fact] public void BindingExtension_Binds_To_Source() { using (StyledWindow()) { var xaml = @" foobar "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var textBlock = window.GetControl("textBlock"); window.Show(); Assert.Equal("foobar", textBlock.Text); } } [Fact] public void BindingExtension_Binds_To_TargetNullValue() { using (StyledWindow()) { var xaml = @" foobar "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var textBlock = window.GetControl("textBlock"); window.DataContext = new FooBar(); window.Show(); Assert.Equal("foobar", textBlock.Text); } } [Fact] public void BindingExtension_TargetNullValue_UnsetByDefault() { using (StyledWindow()) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var textBlock = window.GetControl("textBlock"); window.DataContext = new FooBar(); window.Show(); Assert.Equal(false, textBlock.IsVisible); } } [Fact] public void SupportCastToTypeInExpression() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var contentControl = window.GetControl("contentControl"); var dataContext = new TestDataContext { StringProperty = "foobar" }; window.DataContext = dataContext; Assert.Equal(dataContext.StringProperty, contentControl.Content); } } [Fact] public void SupportCastToTypeInExpression_DifferentTypeEvaluatesToNull() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var contentControl = window.GetControl("contentControl"); var dataContext = "foo"; window.DataContext = dataContext; Assert.Equal(null, contentControl.Content); } } private class FooBar { public object? Foo { get; } = null; } private static IDisposable StyledWindow() { var services = TestServices.StyledWindow.With( theme: () => new Styles { WindowStyle(), }); return UnitTestApplication.Start(services); } private static Style WindowStyle() { return new Style(x => x.OfType()) { Setters = { new Setter( Window.TemplateProperty, new FuncControlTemplate((x, scope) => new VisualLayerManager { Child = new ContentPresenter { Name = "PART_ContentPresenter", [!ContentPresenter.ContentProperty] = x[!Window.ContentProperty], }.RegisterInNameScope(scope) })) } }; } } }