combox数据过滤 wpf_.net - 将枚举属性数据绑定到WPF中的ComboBox

这是一个SelectedItemValue具体答案,基于DevExpress(目前拥有128票)得票最高的答案。

这意味着我们可以在整个应用程序中保持样式的一致性:

遗憾的是,原始答案不适用于DevExpress的SelectedItemValue,无需进行一些修改。

首先,对于SelectedItemValue的XAML:

SelectedItem="{Binding BrokerOrderBookingFilterSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

DisplayMember="Description"

MinWidth="144" Margin="5"

HorizontalAlignment="Left"

IsTextEditable="False"

ValidateOnTextInput="False"

AutoComplete="False"

IncrementalFiltering="True"

FilterCondition="Like"

ImmediatePopup="True"/>

不用说,您需要在包含XAML扩展类(在下面定义)的命名空间中指向SelectedItemValue:

xmlns:xamlExtensions="clr-namespace:XamlExtensions"

我们必须在包含枚举的命名空间指向SelectedItemValue:

xmlns:myEnum="clr-namespace:MyNamespace"

然后,枚举:

namespace MyNamespace

{

public enum EnumFilter

{

[Description("Free as a bird")]

Free = 0,

[Description("I'm Somewhat Busy")]

SomewhatBusy = 1,

[Description("I'm Really Busy")]

ReallyBusy = 2

}

}

使用XAML的问题是我们不能使用SelectedItemValue,因为这会引发错误,因为setter是无法访问的(您的部分疏忽,DevExpress)。 所以我们必须修改我们的ViewModel以直接从对象获取值:

private EnumFilter _filterSelected = EnumFilter.All;

public object FilterSelected

{

get

{

return (EnumFilter)_filterSelected;

}

set

{

var x = (XamlExtensionEnumDropdown.EnumerationMember)value;

if (x != null)

{

_filterSelected = (EnumFilter)x.Value;

}

OnPropertyChanged("FilterSelected");

}

}

为了完整起见,这里是原始答案的XAML扩展(稍微重命名):

namespace XamlExtensions

{

///

/// Intent: XAML markup extension to add support for enums into any dropdown box, see http://bit.ly/1g70oJy. We can name the items in the

/// dropdown box by using the [Description] attribute on the enum values.

///

public class XamlExtensionEnumDropdown : MarkupExtension

{

private Type _enumType;

public XamlExtensionEnumDropdown(Type enumType)

{

if (enumType == null)

{

throw new ArgumentNullException("enumType");

}

EnumType = enumType;

}

public Type EnumType

{

get { return _enumType; }

private set

{

if (_enumType == value)

{

return;

}

var enumType = Nullable.GetUnderlyingType(value) ?? value;

if (enumType.IsEnum == false)

{

throw new ArgumentException("Type must be an Enum.");

}

_enumType = value;

}

}

public override object ProvideValue(IServiceProvider serviceProvider)

{

var enumValues = Enum.GetValues(EnumType);

return (

from object enumValue in enumValues

select new EnumerationMember

{

Value = enumValue,

Description = GetDescription(enumValue)

}).ToArray();

}

private string GetDescription(object enumValue)

{

var descriptionAttribute = EnumType

.GetField(enumValue.ToString())

.GetCustomAttributes(typeof (DescriptionAttribute), false)

.FirstOrDefault() as DescriptionAttribute;

return descriptionAttribute != null

? descriptionAttribute.Description

: enumValue.ToString();

}

#region Nested type: EnumerationMember

public class EnumerationMember

{

public string Description { get; set; }

public object Value { get; set; }

}

#endregion

}

}

免责声明:我与DevExpress没有任何关系。 Telerik也是一个很棒的图书馆。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值