Я знаю, почему это не работает, но я не понимаю, почему это реализовано так, как есть. Глядя с помощью рефлектора кода из метода "FindTemplateResourceInternal
" я нашел ответ:
Type baseType = item.GetType();
if ((baseType.FullName == "System.Xml.Linq.XElement") &&
((obj2 = GetXLinqTagName(item, baseType)) != null))
{
baseType = null;
}
Хорошо, я понимаю, что полное имя моего класса не System.Xml.Linq.XElement
. Но позже, как только вы окажетесь внутри "while":
while (obj2 != null)
{
object obj3 = null;
if (templateType == typeof(DataTemplate))
{
obj3 = new DataTemplateKey(obj2);
}
if (obj3 != null)
{
keys.Add(obj3);
}
if (exactMatch == -1)
{
exactMatch = keys.Count;
}
if (baseType != null)
{
baseType = baseType.BaseType;
//HERE baseType FullName is XElement
//Why don't check it again??
if (baseType == typeof(object))
{
baseType = null;
}
}
obj2 = baseType;
}
Внутри этого цикла, после "baseType=baseType.BaseType"
, если вы проверите еще раз FullName
, теперь это XElement
...
Но вместо этого он теперь ищет DataTemplate
с DataType={x:Type XElement}
...