在数据模板的组合框上设置 ItemsSource

本文关键字:设置 ItemsSource 组合 数据 | 更新日期: 2023-09-27 18:36:08

我在这里的总体目标是拥有一个WPF DataGrid,它将正常显示我的数据,但在编辑时有一个ComboBox,其中包含该特定列的可能值。

例如,我的数据网格中有以下数据

|             Name |               Work Date | Clock In | Clock Out |    Job | Hours |
|------------------|-------------------------|----------|-----------|--------|-------|
| Edaurdo Gutierez |Friday February 12, 2016 |  1:06 PM |   9:00 PM | Server |  8.00 |
|   Rubisel Lozano |Friday February 12, 2016 | 12:55 PM |   8:59 PM | Server |  8.00 |
|       Paul Burks |Friday February 12, 2016 |  8:59 AM |   5:30 PM |   Chef |  8.50 |
|   Roberto Agular |Friday February 12, 2016 |  8:30 AM |   4:10 PM |   Chef |  7.75 |

我希望能够双击一个单元格并编辑它的值,但每列的编辑模板会有所不同。我需要为工作日期、打卡、下班打卡和作业执行此操作。

让"工作日期"列按预期工作,但它更容易,因为它为我填充了日期选择器。对于"作业"列,我最终得到一个空白的组合框,因为我不知道如何设置它的 ItemsSource。下面是使"工作日期"列起作用的一些代码。

XAML

<UserControl.Resources>
    <DataTemplate x:Key="tmpDate">
        <TextBlock Text="{Binding Path = Date, StringFormat = '{}{0:dddd MMMM dd, yyyy}'}"  />
    </DataTemplate>
    <DataTemplate x:Key="tmpDateEdit">
        <DatePicker SelectedDate="{Binding Path = Date}"/>
    </DataTemplate>
</UserControl.Resources>

C#

private void gridTimeSheet_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        DataGridColumn col = e.Column;
        if (col.Header.ToString() == "Date")
        {
            DataGridTemplateColumn tmpCol = new DataGridTemplateColumn();
            tmpCol.CellTemplate = (DataTemplate)FindResource("tmpDate");
            tmpCol.CellEditingTemplate = (DataTemplate)FindResource("tmpDateEdit");
            tmpCol.Header = "Date";
            e.Column = tmpCol;
        }
     }

所以我的问题是我怎样才能使"作业"列以类似的方式工作,以便在双击以编辑单元格时,会出现一个包含"作业"可能值的组合框?我想填充此组合框的方式是通过从SQL查询创建的数据表。

我愿意接受任何建议。也许数据模板不是我执行这些列的最佳选择。任何指导都值得赞赏。

谢谢!

在数据模板的组合框上设置 ItemsSource

我相信这是一个具有约束力的问题。

我认为您寻找的内容与相对来源具有约束力。例如,您可以在数据网格中执行此操作,如下所示:

<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <ComboBox SelectedItem="{Binding Date}" ItemsSource="{Binding DataContext.DateList, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

问题是您当前的行没有用于填充组合框的列表。我假设这些保存在您的视图模型的其他地方。因此,要链接到它,您需要引用您的 ViewModel,这就是与 RelativeSource 绑定所做的。然后,您可以链接到您的集合,在本例中为 DateList。