【问题标题】:Setting ItemsSource on a ComboBox in a DataTemplate在 DataTemplate 中的 ComboBox 上设置 ItemsSource
【发布时间】:2016-06-07 11:31:02
【问题描述】:

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

例如,我的 DataGrid 中有以下数据

|             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 |

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

我的“工作日期”列按预期工作,但它更容易,因为它为我填充了 DatePicker。对于 Job 列,我只是得到一个空白的 ComboBox,因为我不知道如何设置它的 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;
        }
     }

所以我的问题是如何使 Job 列以类似的方式工作,以便当我双击编辑单元格时,会出现一个包含 Jobs 可能值的 ComboBox?我想要填充此 ComboBox 的方式是通过从 SQL 查询创建的 DataTable。

我愿意接受任何建议。也许 DataTemplate 不是我做这些列的最佳选择。任何指导表示赞赏。

谢谢!

【问题讨论】:

    标签: c# wpf combobox datagrid datatemplate


    【解决方案1】:

    我认为这是一个具有约束力的问题。

    我认为您正在寻找与RelativeSource 绑定的内容。例如,您可以像这样在 DataGrid 中执行此操作:

    <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 的其他地方。所以要链接到它,你需要一个对你的 ViewModel 的引用,这就是与 RelativeSource 的绑定所做的。然后您可以链接到您的收藏,在本例中为 DateList。

    【讨论】:

    • 我对此很陌生,所以我以前从未使用过视图模型。我会研究这些是如何工作的,这应该对我有用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2011-04-24
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多