代码之家  ›  专栏  ›  技术社区  ›  TJF

Silverlight 3-从DomainServiceContext将枚举绑定到组合框

  •  3
  • TJF  · 技术社区  · 16 年前

    我刚开始玩Silverlight,一件本应简单的事情,比如绑定Combobox,让我抓狂。我现在读了很多文章,但没有一篇真正解决我所追求的问题,也没有一篇是为Silverlight 2制作的,而且似乎不起作用。

    假设我有一个实体对象“User”,它有一个“UserStatus”字段。在数据库中,UserStatus字段定义为字节,在代码中定义为:

    public enum UserStatus : byte
    {
        Active = 1,
        Locked = 2,
        Suspended = 3,
    }
    

    public class EnumConverter : IValueConverter
    {
        #region IValueConverter Members
    
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            switch (parameter.ToString())
            {
                case "UserStatus":
                    return ((UserStatus)value).ToString();;
            }
    
            return "?";
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    
        #endregion
    }
    

    现在,我还需要为Combobox提供一个ItemSource,所以我实现了这一点:

    internal static class EnumValueCache
    {
        private static readonly IDictionary<Type, object[]> Cache = new Dictionary<Type, object[]>();
    
        public static object[] GetValues(Type type)
        {
            if (!type.IsEnum)
                throw new ArgumentException("Type '" + type.Name + "' is not an enum");
    
            object[] values;
            if (!Cache.TryGetValue(type, out values))
            {
                values = type.GetFields()
                    .Where(f => f.IsLiteral)
                    .Select(f => f.GetValue(null))
                    .ToArray();
                Cache[type] = values;
            }
            return values;
        }
    }
    
    public class EnumValuesConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
                return null;
    
            switch (parameter.ToString())
            {
                case "UserStatus":
                    return EnumValueCache.GetValues(typeof(UserStatus));
            }
    
            return null;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

                                <ComboBox ItemsSource="{Binding UserStatus, Mode=TwoWay, Converter={StaticResource EnumValuesConverter}, ConverterParameter='UserStatus'}" 
                                      SelectedItem="{Binding UserStatus, Mode=TwoWay, Converter={StaticResource EnumConverter}, ConverterParameter='UserStatus'}" />
    

    现在发生的事情是,Items Source被正确绑定,我在下拉列表中看到了所有选项,但是SelectedItem没有设置。 即使我尝试手动将SelectedItem设置为=“1”或“活动”,它们都不起作用。

    谢谢,

    汤姆

    1 回复  |  直到 16 年前
        1
  •  2
  •   AnthonyWJones    16 年前

    我可以看到你的代码有两个问题。

    GetValues 方法返回一个带框枚举值的数组。而你的 EnumConverter

    其次,您需要在 ConvertBack

    推荐文章