【问题标题】:WPF MVVM DataGridComboBox Column Unique ObservableCollectionsWPF MVVM DataGridComboBox 列唯一的 ObservableCollections
【发布时间】: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 中,需要同时动态填充不同数量的行。

标签: c# wpf xaml mvvm combobox


【解决方案1】:

试试这个:

1.在 ViewModel 中创建一个名为“AllSerialNumbers”的 ObservalbleCollection/List(我在下面的示例中使用)。

2.获取您为该产品选择的序列号的 ID/唯一性。 (例如 - SelectedSerialNoId)

3.检查以下示例进行绑定。此代码将查找当前窗口的 DataContext 并从 ObeservableCollection 中查找所有 serailnumbers(步骤 1)

<DataGridComboBoxColumn Header="SerialNumber" 
                                SelectedValueBinding="{Binding SelectedSerialNoId}"
                                SelectedValuePath="SerialNoId"
                                DisplayMemberPath="SerialNumber"
                                >
            <DataGridComboBoxColumn.ElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.AllSerialNumbers}"/>
                </Style>
            </DataGridComboBoxColumn.ElementStyle>
</DataGridComboBoxColumn>

【讨论】:

  • 每一行的 Combobox 必须有它自己的一组用于该特定行的唯一序列号。为每一行搜索 10,000 多个序列号是不合理的。这段代码能做到吗?如果是这样,您能进一步解释一下吗?
  • 您可以在模型级别添加选定的序列号集合,然后使用不同的集合来绑定组合框。
  • 这样的话,绑定的时候就不用去找datacontext了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2015-03-20
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多