[WPF系列]-DataBinding 枚举类型数据源

public class EnumerationDataProvider : ObjectDataProvider
{
    public Type EnumerationType { get; set; }

    public string NoneValue { get; set; }

    public string NoneDisplayValue { get; set; }

    public EnumerationDataProvider()
    {
        this.MethodName = "GetEnumerations";
        this.ObjectType = typeof(EnumerationHelper);
    }

    protected override void EndInit()
    {
        this.MethodParameters.Clear();
        this.MethodParameters.Add(this.EnumerationType);
        this.MethodParameters.Add(this.NoneValue);
        this.MethodParameters.Add(this.NoneDisplayValue);

        base.EndInit();
    }

    private static class EnumerationHelper
    {
        private const string NoneDefaultValue = "None";
        private const string NoneDisplayDefaultValue = "";

        public static IDictionary<object, string> GetEnumerations(
            Type enumType, string noneValue, string noneDisplayValue)
        {
            // Setup defaults if none exists.
            if (string.IsNullOrWhiteSpace(noneValue)) noneValue = NoneDefaultValue;
            if (string.IsNullOrWhiteSpace(noneDisplayValue)) noneDisplayValue = NoneDisplayDefaultValue;

            IDictionary<object, string> items = new Dictionary<object, string>();

            // Find the None enumeration value.
            string noneStringValue = (from n in Enum.GetNames(enumType) 
                                        where string.Compare(n, noneValue, StringComparison.OrdinalIgnoreCase) == 0 
                                        select n).FirstOrDefault();

            bool hasNoneValue = !string.IsNullOrWhiteSpace(noneStringValue);

            object noneEnumerationValue = null;
            if (hasNoneValue)
            {
                // Parse the None value if it exists and add it as the first item.
                noneEnumerationValue = Enum.Parse(enumType, noneStringValue, true);
                items.Add(noneEnumerationValue, noneDisplayValue);
            }

            // Select all enumeration values where not equal to the None value and order by 
            // the enumeration value name.
            var orderedEnums = from v in Enum.GetValues(enumType).Cast<object>() 
                                where !v.Equals(noneEnumerationValue) 
                                orderby Convert.ToString(v) select v;

            foreach (var value in orderedEnums)
                items.Add(value, Convert.ToString(value));

            return items;
        }
    }
}
posted @ 2014-12-25 10:35  霍旭东  阅读(472)  评论(0编辑  收藏  举报