| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- using System;
- using System.Linq;
- using Avalonia.Controls;
- using Avalonia.Controls.Presenters;
- using Avalonia.Controls.Templates;
- using Avalonia.Markup.Xaml.Templates;
- using Avalonia.Markup.Xaml.UnitTests.MarkupExtensions;
- using Avalonia.Metadata;
- using Avalonia.UnitTests;
- using Xunit;
- namespace Avalonia.Markup.Xaml.UnitTests.Xaml
- {
- public class DataTemplateTests : XamlTestBase
- {
- [Fact]
- public void DataTemplate_Can_Be_Empty()
- {
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var xaml = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:sys='clr-namespace:System;assembly=netstandard'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
- <Window.DataTemplates>
- <DataTemplate DataType='{x:Type sys:String}' />
- </Window.DataTemplates>
- <ContentControl Name='target' Content='Foo'/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var target = window.FindControl<ContentControl>("target");
- window.ApplyTemplate();
- target.ApplyTemplate();
- target.Presenter.UpdateChild();
- Assert.Null(target.Presenter.Child);
- }
- }
- [Fact]
- public void DataTemplate_Can_Contain_Name()
- {
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var xaml = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:sys='clr-namespace:System;assembly=netstandard'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
- <Window.DataTemplates>
- <DataTemplate DataType='{x:Type sys:String}'>
- <Canvas Name='foo'/>
- </DataTemplate>
- </Window.DataTemplates>
- <ContentControl Name='target' Content='Foo'/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var target = window.FindControl<ContentControl>("target");
- window.ApplyTemplate();
- target.ApplyTemplate();
- target.Presenter.UpdateChild();
- Assert.IsType<Canvas>(target.Presenter.Child);
- }
- }
- [Fact]
- public void DataTemplate_Can_Contain_Named_UserControl()
- {
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var xaml = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:sys='clr-namespace:System;assembly=mscorlib'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
- <ItemsControl Name='itemsControl' ItemsSource='{Binding}'>
- <ItemsControl.ItemTemplate>
- <DataTemplate>
- <UserControl Name='foo'/>
- </DataTemplate>
- </ItemsControl.ItemTemplate>
- </ItemsControl>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var itemsControl = window.FindControl<ItemsControl>("itemsControl");
- window.DataContext = new[] { "item1", "item2" };
- window.ApplyTemplate();
- itemsControl.ApplyTemplate();
- itemsControl.Presenter.ApplyTemplate();
- Assert.Equal(2, itemsControl.Presenter.Panel.Children.Count);
- }
- }
- [Fact]
- public void XDataType_Should_Be_Assigned_To_Clr_Property()
- {
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var xaml = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:sys='clr-namespace:System;assembly=netstandard'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
- <Window.DataTemplates>
- <DataTemplate x:DataType='sys:String'>
- <Canvas Name='foo'/>
- </DataTemplate>
- </Window.DataTemplates>
- <ContentControl Name='target' Content='Foo'/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var target = window.FindControl<ContentControl>("target");
- var template = (DataTemplate)window.DataTemplates.First();
-
- window.ApplyTemplate();
- target.ApplyTemplate();
- target.Presenter.UpdateChild();
-
- Assert.Equal(typeof(string), template.DataType);
- Assert.IsType<Canvas>(target.Presenter.Child);
- }
- }
-
- [Fact]
- public void XDataType_Should_Be_Ignored_If_DataType_Already_Set()
- {
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var xaml = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:sys='clr-namespace:System;assembly=netstandard'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
- <Window.DataTemplates>
- <DataTemplate DataType='sys:String' x:DataType='UserControl'>
- <Canvas Name='foo'/>
- </DataTemplate>
- </Window.DataTemplates>
- <ContentControl Name='target' Content='Foo'/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var target = window.FindControl<ContentControl>("target");
- window.ApplyTemplate();
- target.ApplyTemplate();
- target.Presenter.UpdateChild();
- Assert.IsType<Canvas>(target.Presenter.Child);
- }
- }
-
- [Fact]
- public void XDataType_Should_Be_Ignored_If_DataType_Has_Non_Standard_Name()
- {
- // We don't want DataType to be mapped to FancyDataType, avoid possible confusion.
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var xaml = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:sys='clr-namespace:System;assembly=netstandard'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
- xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.MarkupExtensions;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <ContentControl Name='target' Content='Foo'>
- <ContentControl.ContentTemplate>
- <local:CustomDataTemplate x:DataType='local:TestDataContext'>
- <TextBlock Text='{CompiledBinding StringProperty}' Name='textBlock' />
- </local:CustomDataTemplate>
- </ContentControl.ContentTemplate>
- </ContentControl>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var target = window.FindControl<ContentControl>("target");
-
- window.ApplyTemplate();
- target.ApplyTemplate();
- target.Presenter.UpdateChild();
- var dataTemplate = (CustomDataTemplate)target.ContentTemplate;
- Assert.Null(dataTemplate.FancyDataType);
- }
- }
-
- [Fact]
- public void Can_Set_DataContext_In_DataTemplate()
- {
- 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;assembly=Avalonia.Markup.Xaml.UnitTests'>
- <Window.DataTemplates>
- <DataTemplate DataType='{x:Type local:TestViewModel}'>
- <Canvas Name='foo' DataContext='{Binding Child}'/>
- </DataTemplate>
- </Window.DataTemplates>
- <ContentControl Name='target' Content='{Binding Child}'/>
- </Window>";
- var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
- var target = window.FindControl<ContentControl>("target");
- var viewModel = new TestViewModel
- {
- String = "Root",
- Child = new TestViewModel
- {
- String = "Child",
- Child = new TestViewModel
- {
- String = "Grandchild",
- }
- },
- };
- window.DataContext = viewModel;
- window.ApplyTemplate();
- target.ApplyTemplate();
- target.Presenter.UpdateChild();
- var canvas = (Canvas)target.Presenter.Child;
- Assert.Same(viewModel, target.DataContext);
- Assert.Same(viewModel.Child, target.Presenter.DataContext);
- Assert.Same(viewModel.Child.Child, canvas.DataContext);
- }
- }
-
- [Fact]
- public void DataTemplates_Without_Type_Should_Throw()
- {
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var xaml = @"
- <Window xmlns='https://github.com/avaloniaui'
- xmlns:sys='clr-namespace:System;assembly=netstandard'
- xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
- <Window.DataTemplates>
- <DataTemplate>
- <Canvas Name='foo'/>
- </DataTemplate>
- </Window.DataTemplates>
- <ContentControl Name='target' Content='Foo'/>
- </Window>";
- Assert.Throws<InvalidOperationException>(() => (Window)AvaloniaRuntimeXamlLoader.Load(xaml));
- }
- }
- }
- }
|