JD2022-TU1/main/tools/qa/Coverity/WPG/PropertyTemplateSelector.cs

56 lines
1.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Controls;
using System.Windows;
using WPG.Data;
namespace WPG
{
public class PropertyTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
Property property = item as Property;
if (property == null)
{
throw new ArgumentException("item must be of type Property");
}
FrameworkElement element = container as FrameworkElement;
if (element == null)
{
return base.SelectTemplate(property.Value, container);
}
DataTemplate template = FindDataTemplate(property, element);
return template;
}
private DataTemplate FindDataTemplate(Property property, FrameworkElement element)
{
Type propertyType = property.PropertyType;
DataTemplate template = TryFindDataTemplate(element, propertyType);
while (template == null && propertyType.BaseType != null)
{
propertyType = propertyType.BaseType;
template = TryFindDataTemplate(element, propertyType);
}
if (template == null)
{
template = TryFindDataTemplate(element, "default");
}
return template;
}
private static DataTemplate TryFindDataTemplate(FrameworkElement element, object dataTemplateKey)
{
object dataTemplate = element.TryFindResource(dataTemplateKey);
if (dataTemplate == null)
{
dataTemplateKey = new ComponentResourceKey(typeof(PropertyGrid), dataTemplateKey);
dataTemplate = element.TryFindResource(dataTemplateKey);
}
return dataTemplate as DataTemplate;
}
}
}