若要填充下拉列表,請首先使用下列選項之一設置 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; }
}