簡體   English   中英

在DataTemplate中的ComboBox上設置ItemsSource

[英]Setting ItemsSource on a ComboBox in a DataTemplate

我在這里的總體目標是擁有一個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;
        }
     }

所以我的問題是,如何使“工作”列以類似的方式工作,以便當我雙擊以編輯單元格時,出現一個可能包含“工作”值的組合框? 我要填充此ComboBox的方法是通過從SQL查詢創建的DataTable。

我願意接受任何建議。 也許DataTemplate不是執行這些列的最佳選擇。 任何指導表示贊賞。

謝謝!

我相信這是一個具有約束力的問題。

我認為您要尋找的是與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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM