gpt4 book ai didi

wpf - 类型列表的附加属性

转载 作者:行者123 更新时间:2023-12-03 12:34:39 27 4
gpt4 key购买 nike

我想创建一个可以与此语法一起使用的附加属性:

<Button>
<Image .../>
<ui:ToolbarItem.DisplayFilter>
<TabItem .../>
<TabItem .../>
<TabItem .../>
</ui:ToolbarItem.DisplayFilter>
</Button>

这是我这样做的尝试:
public class ToolbarItem
{
/// <summary>
/// Identifies the DisplayFilter attached property.
/// </summary>
public static readonly DependencyProperty DisplayFilterProperty =
DependencyProperty.RegisterAttached(
"DisplayFilter",
typeof( IList ),
typeof( ToolbarItem )
);

public static IList GetDisplayFilter( Control item ) {
return (IList)item.GetValue( DisplayFilterProperty );
}

public static void SetDisplayFilter( Control item, IList value ) {
item.SetValue( DisplayFilterProperty, value );
}
}

但是,这会在解析时导致异常——System.ArgumentException:TabItem 不是属性“DisplayFilter”的有效值。那么如何配置我的附加属性以便我可以使用所需的 XAML 语法?

最佳答案

请记住,XAML 基本上只是对象创建的一种简写形式。因此,要创建一个集合/列表作为附加 DisplayFilter 的值您必须附上这些 TabItems 的属性在另一个集合标签内。如果您不想这样做,这是可以理解的,您必须在第一次访问该属性时初始化集合。
这样做只有一个问题:XAML 阅读器跳过 getter 方法作为优化。您可以通过为 选择不同的名称来防止这种行为。姓名 RegisterAttached 的参数称呼:

DependencyProperty.RegisterAttached("DisplayFilterInternal", ...)
然后将调用属性 getter,您可以检查 null .您可以在 this blog post 中了解更多信息。 .
编辑:似乎链接的博客文章不是那么清楚。您只更改传递给 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接口(interface),可以在这种情况下使用。我建议创建一个新的集合类型,以防您将来想对集合进行一些更改:
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);
//}
}

关于wpf - 类型列表的附加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1448899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com