// ----------------------------------------------------------------------- // // Copyright 2014 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- namespace Perspex.Controls { using System; using System.Reflection; public class DataTemplate { public static readonly DataTemplate Default = new DataTemplate(typeof(object), o => new TextBlock { Text = o.ToString() }); 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 t.GetTypeInfo().IsAssignableFrom(o.GetType().GetTypeInfo()); } } 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); } } }