【问题标题】:DataGridComboBoxColumn initial value not displayingDataGridComboBoxColumn 初始值不显示
【发布时间】:2019-11-27 04:37:36
【问题描述】:

我有一个绑定到枚举的 DataGridComboBoxColumn。下拉列表正确显示枚举的值,但组合框最初不显示任何值。我正在尝试将所选值绑定到作为我的 DataGrid 源的 DataTable 的 Gender 属性。我在SelectedItemBinding="{Binding Gender}"SelectedValueBinding="{Binding Gender}" 等类似问题中尝试过这些方法,但它们对我不起作用。

我也尝试在 DataGridTemplateColumn 中放置一个组合框,但它不显示 Gender 值,我最初尝试过 SelectedValue="{Binding Gender}"SelectedValuePath="{Binding Gender}" 但无济于事。 SelectedIndex = "0" 有效,但对我来说没用,因为我希望初始值来自属性。

当我将属性绑定到 DataGridTextColumn 时绑定起作用,因为它显示正确的值,即男性/女性。

XAML:

<ObjectDataProvider x:Key="genderEnum" xmlns:sys="clr-namespace:System;assembly=mscorlib" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
    <ObjectDataProvider.MethodParameters>
        <x:Type TypeName="enumLoc:Gender"/>
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<Grid DataContext="ViewMembers.xaml.cs">
    <DataGrid x:Name="memberDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding Path=memberTable, Mode=TwoWay}" RowDetailsVisibilityMode="VisibleWhenSelected" Width="1200" Height="600" GridLinesVisibility="None" >
        <DataGrid.Columns>                
            <DataGridComboBoxColumn x:Name="memberGenderColumn" SelectedItemBinding="{Binding Gender}" ItemsSource="{Binding Source={StaticResource genderEnum}}"  Header="Gender" Width="60">
            <DataGridTemplateColumn Header="Gender">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Source={StaticResource genderEnum}}" SelectedValue="{Binding Gender}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

XAML.cs:

    DataTable memberTable = new DataTable();
    MemberDatabase members = MemberDatabase.GetApplicationDatabase();

    public ViewMembers()
    {
        InitializeComponent();
        memberTable = members.GetAllMembers();
        memberTable.AsEnumerable().ToList().ForEach(row =>
        {
            var cellList = row.ItemArray.ToList();
            row.ItemArray = cellList.Select(x => x.ToString().Trim()).ToArray();
        });
        this.DataContext = memberTable;
        memberDataGrid.ItemsSource = memberTable.DefaultView;
    }

【问题讨论】:

    标签: c# wpf datagrid datagridcomboboxcolumn


    【解决方案1】:

    您可以通过创建一个从int 转换为您的枚举的非常简单的转换器类来完成这项工作:

    public class EnumConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (Gender)value;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    }
    

    XAML:

    <DataGrid x:Name="memberDataGrid" ...>
        <DataGrid.Resources>
            <local:EnumConverter x:Key="EnumConverter" />
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridComboBoxColumn x:Name="memberGenderColumn" 
                                    SelectedItemBinding="{Binding Gender, Converter={StaticResource EnumConverter}}" 
                                    ItemsSource="{Binding Source={StaticResource genderEnum}}" Header="Gender" Width="60">
            </DataGridComboBoxColumn>
        </DataGrid.Columns>
    </DataGrid>
    

    【讨论】:

    • 原始答案抛出异常,因为该值不是 int 而是字符串,“男性”或“女性”。我尝试了Enum.TryParse(value, out Gender myStatus);,它奏效了,所以感谢您为我指明了正确的方向。我是否必须更改 convertback 方法以返回枚举的字符串?
    • @MarijKhan:如果DataTable 中的列类型是字符串,则需要从string 转换而不是int´ but you don't need to implement ConvertBack`,因为它从未调用过OneWay绑定。
    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 2017-08-20
    • 1970-01-01
    • 2018-02-12
    • 2015-10-21
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多