using System.Reactive.Subjects;
using Avalonia.Controls;
using Avalonia.UnitTests;
using Xunit;
namespace Avalonia.Markup.Xaml.UnitTests.Xaml
{
public class BindingTests : XamlTestBase
{
[Fact]
public void Binding_To_DataContext_Works()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var button = window.FindControl("button");
button.DataContext = new { Foo = "foo" };
window.ApplyTemplate();
Assert.Equal("foo", button.Content);
}
}
[Fact]
public void Longhand_Binding_To_DataContext_Works()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var button = window.FindControl("button");
button.DataContext = new { Foo = "foo" };
window.ApplyTemplate();
Assert.Equal("foo", button.Content);
}
}
[Fact]
public void Can_Bind_Control_To_Non_Control()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var button = window.FindControl("button");
Assert.Same(button, ((NonControl)button.Tag).Control);
}
}
[Fact]
public void Can_Bind_To_DataContext_Of_Anchor_On_Non_Control()
{
using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var button = window.FindControl("button");
button.DataContext = new { Foo = "foo" };
Assert.Equal("foo", ((NonControl)button.Tag).String);
}
}
[Fact]
public void Binding_To_Window_Works()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
window.DataContext = new { Foo = "foo" };
window.ApplyTemplate();
Assert.Equal("foo", window.Title);
}
}
[Fact]
public void Binding_DataContext_To_Inherited_DataContext_Works()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var border = (Border)window.Content;
window.DataContext = new { Foo = "foo" };
window.ApplyTemplate();
window.Presenter.ApplyTemplate();
Assert.Equal("foo", border.DataContext);
}
}
[Fact]
public void Binding_To_Self_Works()
{
using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
{
var xaml = @"
";
var window = AvaloniaXamlLoader.Parse(xaml);
var textBlock = (TextBlock)window.Content;
textBlock.Tag = "foo";
Assert.Equal("foo", textBlock.Text);
}
}
[Fact]
public void Longform_Binding_To_Self_Works()
{
using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var textBlock = (TextBlock)window.Content;
window.ApplyTemplate();
Assert.Equal("foo", textBlock.Text);
}
}
[Fact]
public void Stream_Binding_To_Observable_Works()
{
using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var textBlock = (TextBlock)window.Content;
var observable = new BehaviorSubject("foo");
window.DataContext = new { Observable = observable };
window.ApplyTemplate();
Assert.Equal("foo", textBlock.Text);
observable.OnNext("bar");
Assert.Equal("bar", textBlock.Text);
}
}
[Fact]
public void Binding_To_Namespaced_Attached_Property_Works()
{
using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var textBlock = (TextBlock)window.Content;
window.DataContext = 5.6;
window.ApplyTemplate();
Assert.Equal(5.6, AttachedPropertyOwner.GetDouble(textBlock));
}
}
[Fact]
public void Binding_To_AddOwnered_Attached_Property_Works()
{
using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var testControl = (TestControl)window.Content;
window.DataContext = 5.6;
window.ApplyTemplate();
Assert.Equal(5.6, testControl.Double);
}
}
[Fact]
public void Binding_To_Attached_Property_Using_AddOwnered_Type_Works()
{
using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var textBlock = (TextBlock)window.Content;
window.DataContext = 5.6;
window.ApplyTemplate();
Assert.Equal(5.6, AttachedPropertyOwner.GetDouble(textBlock));
}
}
[Fact]
public void Binding_To_Attached_Property_In_Style_Works()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var textBlock = (TextBlock)window.Content;
window.DataContext = 5.6;
window.ApplyTemplate();
Assert.Equal(5.6, AttachedPropertyOwner.GetDouble(textBlock));
}
}
[Theory,
InlineData(@"Hello \{0\}"),
InlineData(@"'Hello {0}'"),
InlineData(@"Hello {0}")]
public void Binding_To_TextBlock_Text_With_StringConverter_Works(string fmt)
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var textBlock = window.FindControl("textBlock");
textBlock.DataContext = new { Foo = "world" };
window.ApplyTemplate();
Assert.Equal("Hello world", textBlock.Text);
}
}
[Theory,
InlineData("{}{0} {1}!"),
InlineData(@"\{0\} \{1\}!")]
public void MultiBinding_To_TextBlock_Text_With_StringConverter_Works(string fmt)
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var textBlock = window.FindControl("textBlock");
textBlock.DataContext = new WindowViewModel();
window.ApplyTemplate();
Assert.Equal("Hello World!", textBlock.Text);
}
}
[Fact]
public void Binding_OneWayToSource_Works()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
";
var loader = new AvaloniaXamlLoader();
var window = (Window)loader.Load(xaml);
var viewModel = new WindowViewModel();
window.DataContext = viewModel;
window.ApplyTemplate();
Assert.True(window.ShowInTaskbar);
Assert.True(viewModel.ShowInTaskbar);
}
}
private class WindowViewModel
{
public bool ShowInTaskbar { get; set; }
public string Greeting1 { get; set; } = "Hello";
public string Greeting2 { get; set; } = "World";
}
}
}