DataTemplateSelector 的类型初始化在 XAML Designer 中失败
Type initialization of DataTemplateSelector failed in XAML Designer
我在 WPF 应用程序中使用 DataTemplateSelector。在运行时它运行完美,但在使用 XAML 编辑器时抛出异常并且不显示预览。
我的选择器如下所示:
public class DynamicTemplateSelector : DataTemplateSelector
{
public static readonly DependencyProperty TemplatesProperty = DependencyProperty.RegisterAttached("Templates", typeof(TemplateCollection), typeof(DataTemplateSelector), new FrameworkPropertyMetadata(new TemplateCollection(), FrameworkPropertyMetadataOptions.Inherits));
public static TemplateCollection GetTemplates(UIElement element)
{
return (TemplateCollection)element.GetValue(TemplatesProperty);
}
public static void SetTemplates(UIElement element, TemplateCollection collection)
{
element.SetValue(TemplatesProperty, collection);
}
/// <summary>
/// Overriden base method to allow the selection of the correct DataTemplate
/// </summary>
/// <param name="item">The item for which the template should be retrieved</param>
/// <param name="container">The object containing the current item</param>
/// <returns>The <see cref="DataTemplate"/> to use when rendering the <paramref name="item"/></returns>
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
////This should ensure that the item we are getting is in fact capable of holding our property
////before we attempt to retrieve it.
if (!(container is UIElement))
{
return base.SelectTemplate(item, container);
}
////First, we gather all the templates associated with the current control through our dependency property
TemplateCollection templates = GetTemplates(container as UIElement);
if (templates == null || templates.Count == 0)
{
base.SelectTemplate(item, container);
}
////Then we go through them checking if any of them match our criteria
foreach (Template template in templates)
{
////In this case, we are checking whether the type of the item
////is the same as the type supported by our DataTemplate
if (template.Value.IsInstanceOfType(item))
{
////And if it is, then we return that DataTemplate
return template.DataTemplate;
}
}
////If all else fails, then we go back to using the default DataTemplate
return base.SelectTemplate(item, container);
}
}
如果尝试在我的选择器中使用 DesignerProperties.IsInDesignTool 标志但没有成功...
public class TemplateCollection : List<Template>
{
}
public class Template : DependencyObject
{
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(Type), typeof(Template));
public static readonly DependencyProperty DataTemplateProperty = DependencyProperty.Register("DataTemplate", typeof(DataTemplate), typeof(Template));
public Type Value
{
get
{
return (Type)this.GetValue(ValueProperty);
}
set
{
this.SetValue(ValueProperty, value);
}
}
public DataTemplate DataTemplate
{
get
{
return (DataTemplate)this.GetValue(DataTemplateProperty);
}
set
{
this.SetValue(DataTemplateProperty, value);
}
}
}
这是问题所在:
public static readonly DependencyProperty TemplatesProperty =
DependencyProperty.RegisterAttached("Templates", typeof(TemplateCollection),
typeof(DataTemplateSelector), new FrameworkPropertyMetadata(
new TemplateCollection(), FrameworkPropertyMetadataOptions.Inherits));
您正在为基础 class DataTemplateSelector
注册附加 属性 而不是 class 您正在 XAML 中使用 属性 ] DynamicTemplateSelector
这似乎打破了设计者。
我在 WPF 应用程序中使用 DataTemplateSelector。在运行时它运行完美,但在使用 XAML 编辑器时抛出异常并且不显示预览。
我的选择器如下所示:
public class DynamicTemplateSelector : DataTemplateSelector
{
public static readonly DependencyProperty TemplatesProperty = DependencyProperty.RegisterAttached("Templates", typeof(TemplateCollection), typeof(DataTemplateSelector), new FrameworkPropertyMetadata(new TemplateCollection(), FrameworkPropertyMetadataOptions.Inherits));
public static TemplateCollection GetTemplates(UIElement element)
{
return (TemplateCollection)element.GetValue(TemplatesProperty);
}
public static void SetTemplates(UIElement element, TemplateCollection collection)
{
element.SetValue(TemplatesProperty, collection);
}
/// <summary>
/// Overriden base method to allow the selection of the correct DataTemplate
/// </summary>
/// <param name="item">The item for which the template should be retrieved</param>
/// <param name="container">The object containing the current item</param>
/// <returns>The <see cref="DataTemplate"/> to use when rendering the <paramref name="item"/></returns>
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
////This should ensure that the item we are getting is in fact capable of holding our property
////before we attempt to retrieve it.
if (!(container is UIElement))
{
return base.SelectTemplate(item, container);
}
////First, we gather all the templates associated with the current control through our dependency property
TemplateCollection templates = GetTemplates(container as UIElement);
if (templates == null || templates.Count == 0)
{
base.SelectTemplate(item, container);
}
////Then we go through them checking if any of them match our criteria
foreach (Template template in templates)
{
////In this case, we are checking whether the type of the item
////is the same as the type supported by our DataTemplate
if (template.Value.IsInstanceOfType(item))
{
////And if it is, then we return that DataTemplate
return template.DataTemplate;
}
}
////If all else fails, then we go back to using the default DataTemplate
return base.SelectTemplate(item, container);
}
}
如果尝试在我的选择器中使用 DesignerProperties.IsInDesignTool 标志但没有成功...
public class TemplateCollection : List<Template>
{
}
public class Template : DependencyObject
{
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(Type), typeof(Template));
public static readonly DependencyProperty DataTemplateProperty = DependencyProperty.Register("DataTemplate", typeof(DataTemplate), typeof(Template));
public Type Value
{
get
{
return (Type)this.GetValue(ValueProperty);
}
set
{
this.SetValue(ValueProperty, value);
}
}
public DataTemplate DataTemplate
{
get
{
return (DataTemplate)this.GetValue(DataTemplateProperty);
}
set
{
this.SetValue(DataTemplateProperty, value);
}
}
}
这是问题所在:
public static readonly DependencyProperty TemplatesProperty =
DependencyProperty.RegisterAttached("Templates", typeof(TemplateCollection),
typeof(DataTemplateSelector), new FrameworkPropertyMetadata(
new TemplateCollection(), FrameworkPropertyMetadataOptions.Inherits));
您正在为基础 class DataTemplateSelector
注册附加 属性 而不是 class 您正在 XAML 中使用 属性 ] DynamicTemplateSelector
这似乎打破了设计者。