zoukankan      html  css  js  c++  java
  • wpf 当DataGrid列模版是ComboBox时,显示信息

    ​ 实际工作中,有时DataGrid控件某一列显示数据是从Enum集合里面选择出来的,那这时候设置列模版为ComboBox就能满足需求。而关于显示的实际内容,直接是Enum的string()返回值可能不太适合,这时候采用System.ComponentModel.Description是一个很好用的方法。

    代码中定义的显示类型是Enum,实际结果在Description中声明。

    定义 Enum Week

        [System.ComponentModel.Description("星期")]
        public enum Week
        {
            [System.ComponentModel.Description("星期一")]
            Monday,
    
            [System.ComponentModel.Description("星期二")]
            Tuesday,
    
            [System.ComponentModel.Description("星期三")]
            Wednesday,
    
            [System.ComponentModel.Description("星期四")]
            Thursday,
    
            [System.ComponentModel.Description("星期五")]
            Firday,
    
            [System.ComponentModel.Description("星期六")]
            Saturday,
    
            [System.ComponentModel.Description("星期日")]
            Sunday,
        }
    

    DataGrid模版:

    <Grid.Resources>
        <Style x:Key="DataGridTextColumnStyle" TargetType="{x:Type TextBlock}">
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
        </Style>
        
        <Style TargetType="{x:Type DataGrid}">
            <Setter Property="Margin" Value="0"/>
            <Setter Property="Background" Value="#FF8CEB87"/>
            <Setter Property="AutoGenerateColumns" Value="False"/>
            <Setter Property="CanUserAddRows" Value="False"/>
            <Setter Property="CanUserReorderColumns" Value="False"/>
            <Setter Property="CanUserSortColumns" Value="False"/>
            <Setter Property="CanUserResizeColumns" Value="False"/>
            <Setter Property="CanUserResizeRows" Value="False"/>
            <Setter Property="RowHeaderWidth" Value="30"/>
            <Setter Property="RowHeight" Value="30"/>
            <Setter Property="IsReadOnly" Value="True"/>
            <Setter Property="CellStyle">
                <Setter.Value>
                    <Style TargetType="DataGridCell">
                        <Style.Triggers>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter Property="Background" Value="Red"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Setter.Value>
            </Setter>
            <Setter Property="ColumnHeaderStyle">
                <Setter.Value>
                    <Style TargetType="DataGridColumnHeader">
                        <Setter Property="HorizontalContentAlignment" Value="Center"/>
                    </Style>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>
    
    <DataGrid ItemsSource="{Binding TestDatas}" LoadingRow="DataGrid_LoadingRow" Margin="0,0,403.6,10">
        <DataGrid.Resources>
            <ObjectDataProvider x:Key="Weeks" MethodName="GetNames" ObjectType="{x:Type sys:Enum}">
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="local:Week"/>
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
            
            <local:WeekEnumToDescriptionConvertor x:Key="WeekEnumToDescription"/>
            <local:WeekEnumToComboBoxIndexConvertor x:Key="WeekEnumToComboBoxIndex"/>
        </DataGrid.Resources>
        
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Week" Width ="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Source={StaticResource Weeks}, Converter={StaticResource WeekEnumToDescription}}"
                                  SelectedIndex="{Binding TestWeek, Converter={StaticResource WeekEnumToComboBoxIndex}, UpdateSourceTrigger=PropertyChanged}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            
            <DataGridTextColumn Header="Message" 
                                Binding="{Binding TestMsg}" 
                                IsReadOnly="True"
                                ElementStyle ="{StaticResource DataGridTextColumnStyle}"
                                Width ="*"/>
        </DataGrid.Columns>
    </DataGrid>
    

    WeekEnumToDescriptionConvertor、WeekEnumToComboBoxIndexConvertor实现代码:

        class WeekEnumToComboBoxIndexConvertor : System.Windows.Data.IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return ((int)(Week)value);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return ((Week)(int)value);
            }
        }
    
        class WeekEnumToDescriptionConvertor : System.Windows.Data.IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                var strValue = value as string[];
                if (strValue != null)
                {
                    var enValue = new Week[strValue.Length];
                    for (int i = 0; i < strValue.Length; i++)
                    {
                        if (Enum.TryParse(strValue[i], out enValue[i]))
                            strValue[i] = enValue[i].GetDescription();
                    }
                }
                return value;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    

    EnumHelper代码:

        public static class EnumHelper
        {
            public static string GetDescription<T>(this T value) where T : struct
            {
                string result = value.ToString();
    
                var fi = typeof(T).GetField(result);
    
                var attributes = (System.ComponentModel.DescriptionAttribute[])fi.GetCustomAttributes(
                    typeof(System.ComponentModel.DescriptionAttribute), true);
    
                if (attributes != null && attributes.Length > 0)
                {
                    return attributes[0].Description;
                }
                return result;
            }
    
            public static T GetValueByDescription<T>(this string description) where T : struct
            {
                Type type = typeof(T);
                foreach (var field in type.GetFields())
                {
                    if (field.Name == description)
                    {
                        return (T)field.GetValue(null);
                    }
    
                    var attributes = (System.ComponentModel.DescriptionAttribute[])field.GetCustomAttributes(
                        typeof(System.ComponentModel.DescriptionAttribute), true);
    
                    if (attributes != null && attributes.Length > 0)
                    {
                        if (attributes[0].Description == description)
                        {
                            return (T)field.GetValue(null);
                        }
                    }
                }
                throw new ArgumentException(string.Format($"{description} 未能找到对应的枚举"), "Description");
            }
    
            public static T GetValue<T>(this string value) where T : struct
            {
                T result;
                if (Enum.TryParse(value, true, out result))
                {
                    return result;
                }
                throw new ArgumentException(string.Format($"{value} 未能找到对应的枚举"), "Value");
            }
    
        }
    

    最终效果图

    完整代码

  • 相关阅读:
    Node.js安装及环境配置之Windows篇
    盘点.NET JIT在Release下由循环体优化所产生的不确定性Bug
    开源!一款功能强大的高性能二进制序列化器Bssom.Net
    开源 , KoobooJson一款高性能且轻量的JSON框架
    通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
    .Net Web开发技术栈
    web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。
    .Net高级进阶,教你如何构建企业模型数据拦截层,动态控制字段验证
    .Net 如何模拟会话级别的信号量,对http接口调用频率进行限制(有demo)
    .Net高级进阶,在复杂的业务逻辑下,如何以最简练的代码,最直观的编写事务代码?
  • 原文地址:https://www.cnblogs.com/njit-77/p/11516704.html
Copyright © 2011-2022 走看看