📜  datagrid wpf 中的组合框 - C# (1)

📅  最后修改于: 2023-12-03 14:40:37.737000             🧑  作者: Mango

Datagrid WPF 中的组合框介绍

在 WPF 中,Datagrid 是一种常用的用于展示大量数据的控件。其中,组合框(Combobox)是一种可以让用户从预定义的选项列表中进行选择的控件。本文将介绍如何在 Datagrid 中使用组合框。

首先,我们需要在 XAML 中定义 Datagrid 和组合框
    <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
            <DataGridTemplateColumn Header="Category">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding DataContext.Categories, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                                  SelectedItem="{Binding Category, UpdateSourceTrigger=PropertyChanged}"
                                  DisplayMemberPath="Name"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

在这个例子中,我们使用 DataGridTextColumn 来展示数据的名称 Name,并使用 DataGridTemplateColumn 来展示数据的分类 Category。在 DataGridTemplateColumn 中,我们使用了一个 ComboBox 来显示分类列表,并且使用了数据绑定来设置它的 SelectedItem 属性。

然后,我们需要在 ViewModel 中定义数据和分类列表
    public class ViewModel : INotifyPropertyChanged
    {
        public ObservableCollection<DataItem> Items { get; } = new ObservableCollection<DataItem>();
        public ObservableCollection<Category> Categories { get; } = new ObservableCollection<Category>();

        public ViewModel()
        {
            Categories.Add(new Category("Category 1"));
            Categories.Add(new Category("Category 2"));
            Categories.Add(new Category("Category 3"));

            Items.Add(new DataItem("Item 1", Categories[0]));
            Items.Add(new DataItem("Item 2", Categories[1]));
            Items.Add(new DataItem("Item 3", Categories[2]));
        }

        #region INotifyPropertyChanged members

        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion
    }

在这个例子中,我们定义了一个 ObservableCollection<DataItem> 来保存数据,并且定义了一个 ObservableCollection<Category> 来保存分类列表。在构造函数中,我们初始化了这两个列表。

最后,我们需要定义数据模型
    public class DataItem : INotifyPropertyChanged
    {
        private string _name;
        private Category _category;

        public DataItem(string name, Category category)
        {
            _name = name;
            _category = category;
        }

        public string Name
        {
            get { return _name; }
            set { _name = value; NotifyPropertyChanged(); }
        }

        public Category Category
        {
            get { return _category; }
            set { _category = value; NotifyPropertyChanged(); }
        }

        #region INotifyPropertyChanged members

        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion
    }

    public class Category
    {
        public string Name { get; }

        public Category(string name)
        {
            Name = name;
        }
    }

在这个例子中,我们定义了一个将数据的名称和分类保存起来的 DataItem 类,以及将每个分类的名称保存起来的 Category 类。在 DataItem 中,我们使用 INotifyPropertyChanged 接口来实现当数据的属性值改变时可以通知 WPF 更新数据的绑定。

通过上述的步骤,我们可以实现在 Datagrid 中使用组合框来展示数据,并且可以让用户从预定义的分类列表中进行选择。