Silverlight 3 - binding enumeration to combobox from DomainServiceContext

I was just starting to play with Silverlight and, presumably, a simple thing like Combobox binding is driving me crazy. Now I have read a bunch of articles, but none of them address the problem that I encountered or was made for Silverlight 2, and it does not seem to work.

Say I have a User object object that has a UserStatus field. In the database, the UserStatus field is defined as a byte and in the code that it is defined as:

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

When the ADO.NET entity framework creates a user object, it leaves the UserStatus field as a byte. So, to solve this problem, I came across IValueConverter and implemented the following:

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();
    }
}

, XAML:

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

, ItemsSource , , SelectedItem . SelectedItem = "1" "Active", . - , , SelectedItem?

,

Tom

+3
1

.

-, silverlight 3 ComboBox SelectedItem ItemsSource object.Equals. GetValues . EnumConverter . , Silverlight , .

-, ConvertBack, SelectItem (BTW ItemsSource twoway).

+2

Source: https://habr.com/ru/post/1720109/


All Articles