| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- 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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <Button Name='button' Content='{Binding Foo}'/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var button = window.FindControl<Button>("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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <Button Name='button'>
- <Button.Content>
- <Binding Path='Foo'/>
- </Button.Content>
- </Button>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var button = window.FindControl<Button>("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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <Button Name='button' Content='Foo'>
- <Button.Tag>
- <local:NonControl Control='{Binding #button}'/>
- </Button.Tag>
- </Button>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var button = window.FindControl<Button>("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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <Button Name='button'>
- <Button.Tag>
- <local:NonControl String='{Binding Foo}'/>
- </Button.Tag>
- </Button>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var button = window.FindControl<Button>("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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- Title='{Binding Foo}'>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
- <Border DataContext='{Binding Foo}'/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
- <TextBlock Name='textblock' Text='{Binding Tag, RelativeSource={RelativeSource Self}}'/>
- </Window>";
- var window = AvaloniaRuntimeXamlLoader.Parse<ContentControl>(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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
- <TextBlock Name='textblock' Tag='foo'>
- <TextBlock.Text>
- <Binding RelativeSource='{RelativeSource Self}' Path='Tag'/>
- </TextBlock.Text>
- </TextBlock>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
- <TextBlock Name='textblock' Text='{Binding Observable^}'/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var textBlock = (TextBlock)window.Content;
- var observable = new BehaviorSubject<string>("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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <TextBlock local:AttachedPropertyOwner.Double='{Binding}'/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <local:TestControl Double='{Binding}'/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <TextBlock local:TestControl.Double='{Binding}'/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <Window.Styles>
- <Style Selector='TextBlock'>
- <Setter Property='local:TestControl.Double' Value='{Binding}'/>
- </Style>
- </Window.Styles>
- <TextBlock/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <TextBlock Name='textBlock' Text=""{Binding Foo, StringFormat=" + fmt + @"}""/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var textBlock = window.FindControl<TextBlock>("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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <TextBlock Name='textBlock'>
- <TextBlock.Text>
- <MultiBinding StringFormat='" + fmt + @"'>
- <Binding Path='Greeting1'/>
- <Binding Path='Greeting2'/>
- </MultiBinding>
- </TextBlock.Text>
- </TextBlock>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var textBlock = window.FindControl<TextBlock>("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 = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- ShowInTaskbar='{Binding ShowInTaskbar, Mode=OneWayToSource}'>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.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";
- }
- }
- }
|