Помните, что XAML - это просто сокращенная форма создания объекта. Таким образом, чтобы создать коллекцию / список в качестве значения для присоединенного свойства DisplayFilter
, вам необходимо заключить эти TabItems
в другой тег коллекции. Если вы не хотите этого делать, что понятно, вам нужно инициализировать коллекцию при первом обращении к свойству.
Есть только одна проблема: метод getter пропускается читателем XAML как оптимизация. Вы можете предотвратить это поведение, выбрав другое имя для аргумента name для вызова RegisterAttached
:
DependencyProperty.RegisterAttached("DisplayFilterInternal", ...)
Затем будет вызван метод получения свойства, и вы можете проверить наличие 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);
//}
}