using System; using System.Collections.Generic; using System.Text; 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.FindControl("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.FindControl("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.FindControl("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.FindControl("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.FindControl("contentControl"); var dataContext = "foo"; window.DataContext = dataContext; Assert.Equal(null, contentControl.Content); } } private class FooBar { public object Foo { get; } = null; } private IDisposable StyledWindow(params (string, string)[] assets) { var services = TestServices.StyledWindow.With( assetLoader: new MockAssetLoader(assets), theme: () => new Styles { WindowStyle(), }); return UnitTestApplication.Start(services); } private 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) })) } }; } } }