记住,XAML基本上只是对象创建的简写形式。因此,要将集合/列表作为附加的
DisplayFilter
属性的值创建,您必须将那些
TabItems
包含在另一个集合标记中。如果您不想这样做,这是可以理解的,您必须在第一次访问该属性时初始化集合。
但是,这里有一个问题:getter方法被XAML阅读器跳过了,以进行优化。您可以通过选择
RegisterAttached
调用的
name参数的不同名称来防止此行为:
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”不起作用,因为XAML解析器无法调用通用方法“Add(T)”。 “Collection ” 和 “List ” 也实现非泛型的 “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",
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;
}
}