WPF依赖属性作为枚举集合

5

我有一个如下的枚举:

public enum Filter
{
   Filter1,
   Filter2,
   Filter3,
   Filter4
}

我想要这样使用:

<local:myComponent FilterList={Filter.Filter1, Filter.Filter2} />

我尝试使用这个: wpf dependency property enum collection 但它并没有像我预期的那样工作。我不希望用户随意输入,我想让他们使用枚举列表。应该怎么做呢?
2个回答

1
编辑: 如果您的FilterList是一个集合......嗯,它不应该是。或者更好地说,它不必是一个集合,将其作为一个集合只会增加复杂性。

枚举可以用作标志,这意味着只要遵守一些特殊的考虑,就可以将多个值设置为单个枚举属性。

有关Flag Enumerations的更多信息,请参阅MSDN中的此文章:https://msdn.microsoft.com/en-us/library/vstudio/ms229062(v=vs.100).aspx

以及这个链接获取更多信息:http://www.codeproject.com/Articles/396851/Ending-the-Great-Debate-on-Enum-Flags

但基本上,您应该定义您的枚举如下:

public enum Filter
{
   Filter1 = 1,
   Filter2 = 2,
   Filter3 = 4,
   Filter4 = 8
}

然后将您的FilterList属性定义为仅类型为Filter,而不是集合。
public Filter FilterList
{
    get { ... }
    set { ... }
}

一旦完成这一步,您可以按照以下方式从XAML设置属性:
<local:myComponent FilterList="Filter1, Filter2" />

请查看此文章获取更多信息:http://blog.martinhey.de/en/post/2012/06/13/Flagged-enums-and-XAML-syntax.aspx

您可以使用简单的位运算来设置和检查它。

设置:

FilterList = Filter.Filter1 | Filter.Filter2;

检查中:
if ((FilterList & Filter.Filter3) == Filter.Filter3)

...或者...

if (FilterList.HasFlag(Filter.Filter3))

程序上运行良好,但是当我尝试通过 XAML 设置时(<local:myComponent FilterList="Filter1, Filter2" />),该属性不允许在枚举项之间使用逗号甚至空格。它仅显示枚举选项,并且我只能设置一次。 - Evil Str
也许在你的枚举中设置[Flags]属性?我会尝试并回复你。 - almulo
奇怪...在我的例子里,没有 Flags 属性的代码对我来说完全正常...你设置了枚举值为二的幂,就像我所做的那样吗?(1, 2, 4, 8, 16, 等等) - almulo
还有更重要的一点……你是否将FilterList属性更改为仅限Filter类型,而非集合? - almulo
我按照您说的做了,我的枚举被设置为1、2、4、8、16、32、64......而且我已经将属性更改为仅类型过滤器。我不知道可能出了什么问题 :( - Evil Str
我也不知道 :/ 现在有些迷茫了...也许如果您能展示更多的代码就好了...因为它应该是可以工作的,我们肯定忽略了什么。 - almulo

0

假设FilterList是一个Filter枚举项的集合,在你的XAML中这样定义它是否可行?

<local:myComponent>
    <FilterList>
        <x:Static local:Filter.Filter1 />
        <x:Static local:Filter.Filter2 />
    </FilterList>
</local:myComponent>

我不太确定有没有更短的写法,除非使用一个转换器将CSV字符串转换为枚举列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接