Сбой инициализации типа DataTemplateSelector в XAML Designer

Я использую DataTemplateSelector в своем приложении WPF. Во время выполнения он работает отлично, но при использовании редактора 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);
  }
}

}

1 ответ

Решение

Вот проблема:

public static readonly DependencyProperty TemplatesProperty = 
DependencyProperty.RegisterAttached("Templates", typeof(TemplateCollection), 
typeof(DataTemplateSelector), new FrameworkPropertyMetadata(
new TemplateCollection(), FrameworkPropertyMetadataOptions.Inherits));

Вы регистрируете прикрепленное свойство для базового класса DataTemplateSelector вместо класса вы используете свойство в XAML DynamicTemplateSelector который, кажется, сломал дизайнера.

Другие вопросы по тегам