Browse Source

Allowed empty templates

pull/5725/head
Yoh Deadfall 5 years ago
parent
commit
741f3458d4
  1. 2
      src/Markup/Avalonia.Markup.Xaml/Templates/DataTemplate.cs
  2. 3
      src/Markup/Avalonia.Markup.Xaml/Templates/ItemsPanelTemplate.cs
  3. 2
      src/Markup/Avalonia.Markup.Xaml/Templates/Template.cs
  4. 8
      src/Markup/Avalonia.Markup.Xaml/Templates/TemplateContent.cs
  5. 8
      src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs
  6. 25
      tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DataTemplateTests.cs

2
src/Markup/Avalonia.Markup.Xaml/Templates/DataTemplate.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;
}
}
}

3
src/Markup/Avalonia.Markup.Xaml/Templates/ItemsPanelTemplate.cs

@ -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();
}

2
src/Markup/Avalonia.Markup.Xaml/Templates/Template.cs

@ -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();
}

8
src/Markup/Avalonia.Markup.Xaml/Templates/TemplateContent.cs

@ -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));
}
}

8
src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs

@ -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;
}
}

25
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DataTemplateTests.cs

@ -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()
{

Loading…
Cancel
Save