diff --git a/src/Markup/Perspex.Markup.Xaml/Templates/DataTemplate.cs b/src/Markup/Perspex.Markup.Xaml/Templates/DataTemplate.cs index da22cafae2..243ef9ef96 100644 --- a/src/Markup/Perspex.Markup.Xaml/Templates/DataTemplate.cs +++ b/src/Markup/Perspex.Markup.Xaml/Templates/DataTemplate.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using System.Reflection; using OmniXaml.Attributes; using Perspex.Controls; using Perspex.Controls.Templates; @@ -20,7 +21,7 @@ namespace Perspex.Markup.Xaml.Templates throw new InvalidOperationException("DataTemplate must have a DataType."); } - return DataType == data.GetType(); + return DataType.GetTypeInfo().IsAssignableFrom(data.GetType().GetTypeInfo()); } public IControl Build(object data) diff --git a/tests/Perspex.Markup.Xaml.UnitTests/Templates/DataTemplateTests.cs b/tests/Perspex.Markup.Xaml.UnitTests/Templates/DataTemplateTests.cs new file mode 100644 index 0000000000..390331f941 --- /dev/null +++ b/tests/Perspex.Markup.Xaml.UnitTests/Templates/DataTemplateTests.cs @@ -0,0 +1,37 @@ +// Copyright (c) The Perspex Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Perspex.Markup.Xaml.Templates; +using Xunit; + +namespace Perspex.Markup.Xaml.UnitTests.Templates +{ + public class DataTemplateTests + { + [Fact] + public void DataTemplate_Should_Match_Data_Of_Type() + { + var target = new DataTemplate { DataType = typeof(Class1) }; + var data = new Class1(); + + Assert.True(target.Match(data)); + } + + [Fact] + public void DataTemplate_Should_Match_Data_Of_Derived_Type() + { + var target = new DataTemplate { DataType = typeof(Class1) }; + var data = new Class2(); + + Assert.True(target.Match(data)); + } + + private class Class1 { } + private class Class2 : Class1 { } + } +}