【问题标题】:WPF : Binding a combo-box to an enum property of a class object?WPF:将组合框绑定到类对象的枚举属性?
【发布时间】:2009-12-16 12:33:53
【问题描述】:

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

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)数据绑定到“容器”的MYEnum 字段。用户控件驻留在窗口中。

我如何做到这一点?我看过一些ObjectDataProvider 的例子,但是我迷路了。

【问题讨论】:

标签: c# wpf data-binding combobox


【解决方案1】:

您可以使用返回枚举的所有值的自定义标记扩展定义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 绑定到您的 MYEnum 属性:

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

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

【讨论】:

  • 我非常喜欢这个想法,但由于某些原因,我得到一个编译器错误“不一致的可访问性:参数类型 'IServiceProvider' 比方法 'UtilityLib.EnumValuesExtension.ProvideValue(IServiceProvider)' 更难访问”。您完全按原样复制了代码。有什么想法吗?
  • @miliu,您可能在范围内还有另一个IServiceProvider 类型;尝试指定全名:System.IServiceProvider
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 2018-11-12
  • 2020-02-07
  • 1970-01-01
  • 2018-01-12
  • 2015-08-20
  • 1970-01-01
相关资源
最近更新 更多