【问题标题】:Show ComboBox on Datagrid row edit, WPF在 Datagrid 行编辑,WPF 上显示 ComboBox
【发布时间】:2010-10-23 22:01:44
【问题描述】:

我有一个DataGrid,在我的基于 WPF 4 桌面的应用程序中包含数据。 当用户在行DataGrid 上单击两次时,将切换到编辑模式,用户可以在其中更改单元格的值。现在我希望在特定单元格上,用户只能从组合框中选择值,例如性别 - 男性/女性,不要输入其他内容。

如何在DataGrid的编辑模式下显示组合框?

【问题讨论】:

    标签: c# wpf datagrid combobox


    【解决方案1】:

    实际上有很多不同的方法,

    绑定到枚举

    public enum ChoiseEnum
    {
        Yes,
        No,
        Maybe
    }
    

    首先你需要一个 ObjectDataProvider

    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    
    <ObjectDataProvider MethodName="GetValues"
                        ObjectType="{x:Type sys:Enum}"
                        x:Key="ChoiseEnumDataProvider">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:ChoiseEnum" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
    

    然后我们可以像这样将 DataGridComboBoxColumn 绑定到一个名为 Choise 的属性

    <DataGrid Name="c_dataGrid"
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridComboBoxColumn Header="Choise"
                                    SelectedItemBinding="{Binding Choise}"
                                    ItemsSource="{Binding Source={StaticResource ChoiseEnumDataProvider}}"/>
        </DataGrid.Columns>
    </DataGrid>
    

    仅在组合框中显示静态列表中的值

    更新
    添加了更多细节

    namespace ComboBoxDataGrid
    {
        public class TestClass
        {
            static TestClass()
            {
                ChoiseData = new List<string>();
                ChoiseData.Add("Yes");
                ChoiseData.Add("No");
                ChoiseData.Add("Maybe");
            }
            public static List<string> ChoiseData
            {
                get;
                set;
            }
    
            public TestClass()
            {
                SelectedChoise = string.Empty;
            }
            public TestClass(string selectedChoise)
            {
                SelectedChoise = selectedChoise;
            }
            public string SelectedChoise
            {
                get;
                set;
            }
        }
    }
    
    public partial class WinWorkers: Window
    {
        public WinWorkers()
        {
            InitializeComponent();
            TestClasses = new ObservableCollection<TestClass>();
            TestClasses.Add(new TestClass("Yes1"));
            TestClasses.Add(new TestClass("No"));
            TestClasses.Add(new TestClass("Maybe"));
            c_dataGrid.ItemsSource = TestClasses;
        }
    
        public ObservableCollection<TestClass> TestClasses
        {
            get;
            set;
        }
    }
    
    <Window x:Class="ComboBoxDataGrid.WinWorkers"
            xmlns:local="clr-namespace:ComboBoxDataGrid"
            ...>
        <Window.Resources>
            <local:TestClass x:Key="TestClass" />
        </Window.Resources>
        <Grid>
            <DataGrid Name="c_dataGrid"
                      AutoGenerateColumns="False"
                      RowHeaderWidth="100">
                <DataGrid.Columns>
                    <DataGridComboBoxColumn Header="Choise_StaticList"
                                            SelectedValueBinding="{Binding SelectedChoise}"
                                            ItemsSource="{Binding Source={StaticResource TestClass}, Path=ChoiseData}"/>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    

    【讨论】:

    • 我试过你的最后一种方法,但实际上没有执行绑定,我看到一个干净的组合框。我的窗口叫做 WinWorkers。正如您所提到的,我在 WinWorkers.cs 中创建了一个值列表,添加了 getter 和 setter。在 WinWorkers.xaml 中,我以不同的方式放置 DataGridComboBoxColumn 并设置了 ItemSource,但它不起作用。例如ItemsSource="{Binding Path=ListName}" 不起作用。如何连接到在同一类中创建的列表«genderList»?谢谢。
    • 用更多细节更新了第二个例子
    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 2015-11-07
    • 2019-02-24
    • 2011-11-10
    • 2011-04-25
    • 1970-01-01
    • 2019-12-03
    • 2012-10-09
    相关资源
    最近更新 更多