【发布时间】:2018-02-07 23:47:20
【问题描述】:
在我的 WPF MVVM 项目中,我有一个填充了 ObservableCollection (CaseCardEquipmentList) 和 ComboBox 列的 DataGrid。 ComboBox Column 中的每个 ComboBox 都需要填充一个相对于其各自行中的值的 ObservableCollection (SerialNumList)。这可能吗?例如,如果DataGrid中有以下值:
Equip Type | OEM Name | Equip Name | Equip Model | Serial Num |
-----------|----------|------------|-------------|------------|
Nav | Global | System 2 | v.2.1 | COMBOBOX |
Shoes | Footwear | Adidas | Old | COMBOBOX |
Shirt | UA | Clothing | Smelly | COMBOBOX |
...ComboBoxes 需要在 ObservableCollection CaseCardEquipmentList 的每一行中显示与底层标识属性“OPEquipIDNum”相关的所有序列号 (SerialNumList)。我该怎么办?
XAML
<Grid Grid.Row="2">
<DataGrid HorizontalAlignment="Center"
Width="Auto"
ItemsSource="{Binding CaseCardEquipmentList}"
AutoGenerateColumns="False"
CanUserAddRows="False"
>
<DataGrid.Columns>
<DataGridTextColumn Header="Equipment Type" Width="Auto" Binding="{Binding EquipTypeName}"/>
<DataGridTextColumn Header="OEM Name" Width="Auto" Binding="{Binding OEMName}"/>
<DataGridTextColumn Header="Equipment Name" Width="Auto" Binding="{Binding EquipName}"/>
<DataGridTextColumn Header="Equipment Model" Width="Auto" Binding="{Binding EquipModel}"/>
<DataGridTemplateColumn Header="SerialNum">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding SerialNumList}"
DisplayMemberPath="SerialNum"
SelectedValuePath="FacilityEquipIDNum"
SelectedValue="{Binding SelectedFacEquipIDNum, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
视图模型
private ObservableCollection<ALLCaseCardEquipPrep> _caseCardEquipmentList;
public ObservableCollection<ALLCaseCardEquipPrep> CaseCardEquipmentList
{
get { return _caseCardEquipmentList; }
set
{
SetProperty(ref _caseCardEquipmentList, value, () => CaseCardEquipmentList);
if (_caseCardEquipmentList != null)
{
GetSerialNumList(CaseCardEquipmentList);
}
}
}
public ObservableCollection<FacilityEquipment> SerialNumList
{
get { return _serialNumList; }
set { SetProperty(ref _serialNumList, value, () => SerialNumList); }
}
public Int32 SelectedFacEquipIDNum
{
get { return _selectedFacEquipIDNum; }
set { SetProperty(ref _selectedFacEquipIDNum, value, () => SelectedFacEquipIDNum); }
}
public void GetSerialNumList(ObservableCollection<ALLCaseCardEquipPrep> ccel)
{
foreach (ALLCaseCardEquipPrep item in ccel.ToList())
{
facilityequipment = new FacilityEquipment();
facilityequipment.fillFacEquipSerialNumList(item.OPEquipIDNum);
SerialNumList = facilityequipment.FacilityEquipmentList;
}
}
型号
public FacilityEquipment(int count, int facilityequipmentidnum, string serialnum)
{
Count = count;
FacilityEquipmentIDNum = facilityequipmentidnum;
SerialNum = serialnum;
FacilityEquipmentList = new ObservableCollection<FacilityEquipment>();
}
public void fillFacEquipSerialNumList(int opequipidnum)
{
using (MySqlConnection con = new MySqlConnection(dbConnectionString))
{
FacilityEquipmentList = new ObservableCollection<FacilityEquipment>();
con.Open();
string Query = "SELECT Fac_Equip_ID_Num, Serial_Num FROM facility_equipment WHERE OP_Equip_ID_Num ='" + opequipidnum + "' ";
MySqlCommand createCommand = new MySqlCommand(Query, con);
MySqlDataReader dr = createCommand.ExecuteReader();
int count = 1;
while (dr.Read())
{
int FacilityEquipmentIDNum = dr.GetInt32(0);
string SerialNum = dr.GetString(1);
FacilityEquipment facequip = new FacilityEquipment(count, FacilityEquipmentIDNum, SerialNum);
FacilityEquipmentList.Add(facequip);
count++;
}
con.Close();
}
}
【问题讨论】:
-
您显示的代码看起来应该已经产生了您想要的东西,所以我不确定您的问题是什么。或者为什么你甚至在这里使用 ComboBox 来选择?你能详细说明一下吗?
-
组合框出现空白。我需要将特定的序列号应用于行中的项目。在所有项目都有一个选定的序列号之后,我想将生成的 SelectedFacEquipIDNums 用于另一个列表。
-
看看这个link,你也不需要使用DataGridTemplateColumn,因为wpf datagrid已经内置了DataGridComboBoxColumn。
-
关于“如何将 ObservabelCollection 绑定到组合框?”的问题数量惊人。这个教程看起来不错:c-sharpcorner.com/article/explain-combo-box-binding-in-mvvm-wpf
-
Christopher - 例如,我可能有 5 双旧阿迪达斯鞋,需要通过序列号选择特定的一双。衬衫等也是如此。此外,我相信该链接适用于独立的组合框。这些 ComboBox 位于 Datagrid 中,需要同时动态填充不同数量的行。