【问题标题】:MVVM Bind enum to Combobox [duplicate]MVVM将枚举绑定到组合框[重复]
【发布时间】:2016-02-06 02:52:50
【问题描述】:

我在 WPF 应用程序中使用 caliburn 微框架。 我需要将此枚举绑定到组合框。

在 ViewModel 中考虑以下枚举:

public enum MovieType
{
    [Description("Action Movie")]
    Action,
    [Description("Horror Movie")]
    Horror
}
  1. 如何将此枚举绑定到组合框?
  2. 是否可以在中显示枚举值的枚举描述 组合框?
  3. 我可以为此目的实现 IvalueConverter 吗?

【问题讨论】:

  • 所有这三个问题都在我上面发布的链接中处理。

标签: c# wpf mvvm enums caliburn.micro


【解决方案1】:

在你的Window/UserControl/的资源中?你必须创建一个ObjectDataProvider 像:

<ObjectDataProvider x:Key="MovieDataProvider" MethodName="GetValues" ObjectType="{x:Type namespace:MovieType}">
   <ObjectDataProvider.MethodParameters>
      <x:Type Type="namespace:MovieType"/>
   </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

要将其用作ComboBox 的 itemssource,您必须执行以下操作:

ItemsSource="{Binding Source={StaticResource MovieDataProvider}}"

如果您想显示自定义值,您可以修改 ComboBox 的 ItemTemplate,例如:

<ComboBox.ItemTemplate>
   <DataTemplate>
      <TextBlock Text="{Binding Converter={converters:MovieDisplayConverter}}"/>
   </DataTemplate>
</ComboBox>

如果您想返回自定义值,MovieDisplayConverter 可能如下所示:

internal class MovieDisplayConverter : MarkupExtension, IValueConverter
    {
        private static MovieDisplayConverter converter;

        public MovieDisplayConverter()
        {

        }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is MovieType)
            {


                switch ((MovieType)value)
                {
                    case MovieType.Action:
                        return "Action Movie";
                    case MovieType.Horror:
                        return "Horror Movie";
                    default:
                        throw new ArgumentOutOfRangeException("value", value, null);
                }
            }
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return converter ?? (converter = new MovieDisplayConverter());
        }
    }

如果您想要 ComboBox 中的枚举值的描述​​属性,请将上述转换器的转换方法替换为以下内容:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is MovieType)
            {
                FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
                if (fieldInfo != null)
                {
                    object[] attributes = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), true);
                    if (attributes.Length > 0)
                    {
                        return ((DescriptionAttribute)attributes[0]).Description;
                    }
                }
            }
            return value;
        }

【讨论】:

  • 嘿,你迟到了 1 分钟! :)
猜你喜欢
  • 2015-08-20
  • 2011-08-04
  • 2018-11-12
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
相关资源
最近更新 更多