|
|
@@ -1,5 +1,11 @@
|
|
|
+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;
|
|
|
|
|
|
@@ -89,6 +95,93 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [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();
|
|
|
+ ((ContentPresenter)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();
|
|
|
+ ((ContentPresenter)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();
|
|
|
+ ((ContentPresenter)target.Presenter).UpdateChild();
|
|
|
+
|
|
|
+ var dataTemplate = (CustomDataTemplate)target.ContentTemplate;
|
|
|
+ Assert.Null(dataTemplate.FancyDataType);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
[Fact]
|
|
|
public void Can_Set_DataContext_In_DataTemplate()
|
|
|
{
|
|
|
@@ -132,5 +225,25 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
|
|
|
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));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|