【转】WPF DataGridComboBoxColumn使用
若要填充下拉列表,请首先使用下列选项之一设置 ComboBox 的 ItemsSource 属性。
静态资源。
x:Static 代码实体。
ComboBoxItem 类型的内联集合。
实现效果如下:
如需使用非静态资源,则需要使用DataGridComboBoxColumn的EditingElementStyle样式修改编辑样式,通过ElementStyle修改正常显示(非编辑状态)样式。
主要XAML代码如下:
<DataGrid x:Name="grd" ItemsSource="{Binding StuList3}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding No}" Header="学号"/> <DataGridTextColumn Binding="{Binding Name}" Header="姓名"/> <!--使用普通List集合--> <DataGridComboBoxColumn x:Name="cmb" Header="性别"> <DataGridComboBoxColumn.EditingElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding Path=DataContext.SexList,ElementName=grd}" /> <Setter Property="DisplayMemberPath" Value="Name" /> <Setter Property="SelectedValuePath" Value="Name" /> <Setter Property="SelectedValue" Value="{Binding Sex,UpdateSourceTrigger=PropertyChanged}" /> </Style> </DataGridComboBoxColumn.EditingElementStyle> <DataGridComboBoxColumn.ElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding Path=DataContext.SexList,ElementName=grd}" /> <Setter Property="DisplayMemberPath" Value="Name" /> <Setter Property="SelectedValuePath" Value="Name" /> <Setter Property="SelectedValue" Value="{Binding Sex}" /> </Style> </DataGridComboBoxColumn.ElementStyle> </DataGridComboBoxColumn> <!--使用静态资源--> <DataGridComboBoxColumn Header="性别(静态资源)" ItemsSource="{Binding Source={StaticResource myEnum}}" TextBinding="{Binding Sex}" SelectedItemBinding="{Binding Sex,UpdateSourceTrigger=PropertyChanged}"> </DataGridComboBoxColumn> <!--使用x:Static扩展标记--> <DataGridComboBoxColumn Header="性别(x:Static)" ItemsSource="{x:Static local:ViewModel.SexList2}" TextBinding="{Binding Sex}" SelectedItemBinding="{Binding Sex,UpdateSourceTrigger=PropertyChanged}"> </DataGridComboBoxColumn> <!--使用内联集合--> <DataGridComboBoxColumn Header="性别(内联集合)" TextBinding="{Binding Sex}" SelectedItemBinding="{Binding Sex,UpdateSourceTrigger=PropertyChanged}"> <DataGridComboBoxColumn.ItemsSource> <col:ArrayList> <sys:String>男</sys:String> <sys:String>女</sys:String> </col:ArrayList> </DataGridComboBoxColumn.ItemsSource> </DataGridComboBoxColumn> </DataGrid.Columns> </DataGrid>
原文地址:https://blog.csdn.net/rabbitsoft_1987/article/details/22896073
根据上述文章,我试了一下简化,可以实现效果
前端:(DisplayMemberPath="Name" 这里是显示 Element的 名字)
<DataGrid Name="grdBeam" ItemsSource="{Binding BeamCollection}" Grid.ColumnSpan="3" CanUserAddRows="False" AutoGenerateColumns="False" Background="LightGray"> <DataGrid.Columns> <DataGridComboBoxColumn Header="材质" SelectedItemBinding="{Binding BeamMaterial}" DisplayMemberPath="Name" Width="1*"> <DataGridComboBoxColumn.EditingElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding Path=DataContext.MaterialItems,ElementName=grdBeam}" /> </Style> </DataGridComboBoxColumn.EditingElementStyle> <DataGridComboBoxColumn.ElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding Path=DataContext.MaterialItems,ElementName=grdBeam}" /> </Style> </DataGridComboBoxColumn.ElementStyle> </DataGridComboBoxColumn> </DataGrid.Columns> </DataGrid>
后端:
public partial class BeamView : Window { public BeamView() { InitializeComponent(); this.DataContext = this; } public ObservableCollection<BeamGroup> BeamCollection { get; set; } = new ObservableCollection<BeamGroup>(); /// <summary> /// 材料列表 /// </summary> public List<Element> MaterialItems { get; set; } = new List<Element>(); } public class BeamGroup { public Element BeamMaterial { get { return _beamMaterial; } set { _beamMaterial = value; } }
//.....此处省略N多个属性
private Element _beamMaterial; }
public class Element
{
public string Name { get; set; }
}
标签:
WPF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义