📅  最后修改于: 2023-12-03 14:40:37.737000             🧑  作者: Mango
在 WPF 中,Datagrid 是一种常用的用于展示大量数据的控件。其中,组合框(Combobox)是一种可以让用户从预定义的选项列表中进行选择的控件。本文将介绍如何在 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
属性。
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 中使用组合框来展示数据,并且可以让用户从预定义的分类列表中进行选择。