// ----------------------------------------------------------------------- // // Copyright 2014 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- namespace Perspex.Controls { using System; using System.Reflection; public class DataTemplate : IDataTemplate { public static readonly DataTemplate Default = new DataTemplate(typeof(object), o => (o != null) ? new TextBlock { Text = o.ToString() } : null); public DataTemplate(Func build) : this(o => true, build) { } public DataTemplate(Type type, Func build) : this(o => IsInstance(o, type), build) { } public DataTemplate(Func match, Func build) { Contract.Requires(match != null); Contract.Requires(build != null); this.Match = match; this.Build = build; } public Func Match { get; private set; } public Func Build { get; private set; } public static bool IsInstance(object o, Type t) { return (o != null) ? t.GetTypeInfo().IsAssignableFrom(o.GetType().GetTypeInfo()) : false; } bool IDataTemplate.Match(object data) { return this.Match(data); } Control IDataTemplate.Build(object data) { return this.Build(data); } } public class DataTemplate : DataTemplate { public DataTemplate(Func build) : base(typeof(T), DataTemplate.Cast(build)) { } public DataTemplate(Func match, Func build) : base(CastMatch(match), DataTemplate.Cast(build)) { } private static Func CastMatch(Func f) { return o => (o is T) ? f((T)o) : false; } private static Func Cast(Func f) { return o => f((T)o); } } }