c# - WPF : Binding a combo-box to an enum property of a class object?

标签 c# wpf data-binding combobox

在命名空间 X 中,我有一个公共(public)枚举定义:

namespace X
{
    public enum MyEnum
    { val0=0, val1, val2, val3, val4 }
}

在命名空间 Y 中,我有一个类具有 X.MyEnum 类型的属性

using namespace X;
namespace Y
{
    class Container
    {
        public MyEnum MYEnum
        { get { return m_myenum; } set { m_myenum = value; } }

        private MyEnum m_myenum;
    }
}

我创建了一个包含ComboBox 的用户控件。我非常想将它(TwoWay)数据绑定(bind)到“容器”的 MYEnum 字段。用户控件驻留在窗口中。

我该如何实现?我看过一些使用 ObjectDataProvider 的示例,但是我迷路了。

最佳答案

您可以通过使用返回枚举的所有值的自定义标记扩展来定义 ComboBoxItemsSource(这与使用 实现相同的结果ObjectDataProvider,但使用起来更简单):

[MarkupExtensionReturnType(typeof(Array))]
public class EnumValuesExtension : MarkupExtension
{
    public EnumValuesExtension()
    {
    }

    public EnumValuesExtension(Type enumType)
    {
        this.EnumType = enumType;
    }

    [ConstructorArgument("enumType")]
    public Type EnumType { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return Enum.GetValues(EnumType);
    }
}

并将 SelectedItem 绑定(bind)到您的 MYEnum 属性:

<ComboBox ItemsSource="{local:EnumValues local:MyEnum}" SelectedItem="{Binding MYEnum, Mode=TwoWay}" />

(local XML 命名空间必须映射到您的 C# 命名空间)

关于c# - WPF : Binding a combo-box to an enum property of a class object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1914402/

相关文章:

c# - 如何迭代静态类中的所有静态公共(public)Guid

javascript - on-change 和 ng-change 的区别

Android 子类的数据绑定(bind)

c# - 创建页面的新实例并获取 URL

c# - WPF - DataGrid 将列绑定(bind)到方法而不是属性

C# 如何将我的 dll 添加到 .Net Framework 组件列表

c# - 将 TreeView 绑定(bind)到包含多个对象的单个对象

WPF:处理损坏的字体缓存

c# - WPF 应用程序中的 Log4Net 设置

.net - 列表框刷新的 MVVM 出现问题