Browse Source
Merge pull request #5725 from YohDeadfall/empty-templates
Allowed empty templates
pull/5729/head
Nikita Tsukanov
6 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with
40 additions and
8 deletions
-
src/Markup/Avalonia.Markup.Xaml/Templates/DataTemplate.cs
-
src/Markup/Avalonia.Markup.Xaml/Templates/ItemsPanelTemplate.cs
-
src/Markup/Avalonia.Markup.Xaml/Templates/Template.cs
-
src/Markup/Avalonia.Markup.Xaml/Templates/TemplateContent.cs
-
src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs
-
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DataTemplateTests.cs
|
|
|
@ -30,7 +30,7 @@ namespace Avalonia.Markup.Xaml.Templates |
|
|
|
|
|
|
|
public IControl Build(object data, IControl existing) |
|
|
|
{ |
|
|
|
return existing ?? TemplateContent.Load(Content).Control; |
|
|
|
return existing ?? TemplateContent.Load(Content)?.Control; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -10,8 +10,7 @@ namespace Avalonia.Markup.Xaml.Templates |
|
|
|
[TemplateContent] |
|
|
|
public object Content { get; set; } |
|
|
|
|
|
|
|
public IPanel Build() |
|
|
|
=> (IPanel)TemplateContent.Load(Content).Control; |
|
|
|
public IPanel Build() => (IPanel)TemplateContent.Load(Content)?.Control; |
|
|
|
|
|
|
|
object ITemplate.Build() => Build(); |
|
|
|
} |
|
|
|
|
|
|
|
@ -10,7 +10,7 @@ namespace Avalonia.Markup.Xaml.Templates |
|
|
|
[TemplateContent] |
|
|
|
public object Content { get; set; } |
|
|
|
|
|
|
|
public IControl Build() => TemplateContent.Load(Content).Control; |
|
|
|
public IControl Build() => TemplateContent.Load(Content)?.Control; |
|
|
|
|
|
|
|
object ITemplate.Build() => Build(); |
|
|
|
} |
|
|
|
|
|
|
|
@ -1,6 +1,4 @@ |
|
|
|
using System; |
|
|
|
using Avalonia.Controls; |
|
|
|
using System.Collections.Generic; |
|
|
|
using Avalonia.Controls.Templates; |
|
|
|
|
|
|
|
namespace Avalonia.Markup.Xaml.Templates |
|
|
|
@ -14,6 +12,12 @@ namespace Avalonia.Markup.Xaml.Templates |
|
|
|
{ |
|
|
|
return (ControlTemplateResult)direct(null); |
|
|
|
} |
|
|
|
|
|
|
|
if (templateContent is null) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
throw new ArgumentException(nameof(templateContent)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -51,8 +51,12 @@ namespace Avalonia.Markup.Xaml.Templates |
|
|
|
|
|
|
|
public IControl Build(object data) |
|
|
|
{ |
|
|
|
var visualTreeForItem = TemplateContent.Load(Content).Control; |
|
|
|
visualTreeForItem.DataContext = data; |
|
|
|
var visualTreeForItem = TemplateContent.Load(Content)?.Control; |
|
|
|
if (visualTreeForItem != null) |
|
|
|
{ |
|
|
|
visualTreeForItem.DataContext = data; |
|
|
|
} |
|
|
|
|
|
|
|
return visualTreeForItem; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -7,6 +7,31 @@ 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(); |
|
|
|
((ContentPresenter)target.Presenter).UpdateChild(); |
|
|
|
|
|
|
|
Assert.Null(target.Presenter.Child); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void DataTemplate_Can_Contain_Name() |
|
|
|
{ |
|
|
|
|