Ответ 1
Помните, что XAML - это просто сокращенная форма создания объекта. Поэтому для создания коллекции/списка в качестве значения для прикрепленного свойства DisplayFilter
вам придется заключить те TabItems
внутри другого тега коллекции. Если вы не хотите этого делать, что понятно, вы должны инициализировать коллекцию при первом доступе к ресурсу.
Есть только одна проблема: метод getter пропускается читателем XAML в качестве оптимизации. Вы можете предотвратить это поведение, выбирая другое имя для аргумента name для вызова RegisterAttached
:
DependencyProperty.RegisterAttached("DisplayFilterInternal", ...)
Затем будет вызываться свойство getter, и вы можете проверить null
. Вы можете узнать больше об этом в этом сообщении в блоге.
Изменить: Кажется, что связанное сообщение в блоге не так понятно. Вы меняете только имя строки, переданной в RegisterAttached
, а не на имя статических методов get/set:
public static readonly DependencyProperty DisplayFilterProperty =
DependencyProperty.RegisterAttached(
"DisplayFilterInternal",
typeof(IList),
typeof(ToolbarItem));
public static TabItemCollection GetDisplayFilter(Control item)
{ ... }
public static void SetDisplayFilter(Control item, IList value)
{ ... }
Вы должны инициализировать коллекцию в методе GetDisplayFilter
:
public static TabItemCollection GetDisplayFilter(Control item)
{
var collection = (IList)item.GetValue(DisplayFilterProperty);
if (collection == null) {
collection = new List<object>();
item.SetValue(DisplayFilterProperty, collection);
}
return collection;
}
Кажется, что вы добавляете только элементы TabItem
к этой коллекции. Затем вы можете сделать тип коллекции безопасным, но использование IList<T>
не работает, поскольку анализатор XAML не может вызвать общий метод Add(T)
. Collection<T>
и List<T>
также реализуют не общий интерфейс IList
и могут быть использованы в этом случае. Я бы предложил создать новый тип коллекции, если вы захотите внести некоторые изменения в коллекцию в будущем:
public class TabItemCollection : Collection<TabItem>
{
}
Если вам не нужно устанавливать коллекцию явно следующим образом:
<ui:ToolbarItem.DisplayFilter>
<ui:TabItemCollection>
<TabItem/>
</ui:TabItemCollection>
</ui:ToolbarItem.DisplayFilter>
вы можете удалить метод SetDisplayFilter
.
Подводя итог:
public class TabItemCollection : Collection<TabItem>
{
}
public class ToolbarItem
{
public static readonly DependencyProperty DisplayFilterProperty =
DependencyProperty.RegisterAttached(
"DisplayFilterInternal", // Shadow the name so the parser does not skip GetDisplayFilter
typeof(TabItemCollection),
typeof(ToolbarItem));
public static TabItemCollection GetDisplayFilter(Control item)
{
var collection = (TabItemCollection)item.GetValue(DisplayFilterProperty);
if (collection == null) {
collection = new TabItemCollection();
item.SetValue(DisplayFilterProperty, collection);
}
return collection;
}
// Optional, see above note
//public static void SetDisplayFilter(Control item, TabItemCollection value)
//{
// item.SetValue(DisplayFilterProperty, value);
//}
}