【问题标题】:DatagridComboboxColumn Binding in WPFWPF中的DatagridComboboxColumn绑定
【发布时间】:2017-06-25 15:48:01
【问题描述】:

我是 WPF 编程新手。

我有一个包含 2 列的数据网格。第一列是 dataGridTextColumn,第二列是 DataGridComboboxColumn。

我有 2 个来自数据库的值。我想在数据网格第一列中显示一个值,第二个值我想将其用作组合框列的选定项/值。

要添加到组合框的值是静态的,即 0 到 9。

XAML
<DataGrid x:Name="dg_phase_details" RowHeaderWidth="0" SelectionMode="Single" CellStyle="{StaticResource Body_Content_DataGrid_Centering}" AutoGenerateColumns="False" CanUserAddRows="False" HorizontalAlignment="Left" Margin="380,154,0,0" VerticalAlignment="Top" Height="320" Width="330" AlternationCount="2" AlternatingRowBackground="LightGray" RowHeight="30" CanUserSortColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="Phase_Name" IsReadOnly="True" Header="Phases" Binding="{Binding Phase}" Width="*" ElementStyle="{StaticResource dg_Margin_left}"/>
            <DataGridComboBoxColumn x:Name="Combo_Imp_Value" Header="Importance" Width="*"  />
        </DataGrid.Columns>
    </DataGrid>

c#
ObservableCollection<string> list_PhaseVal = new ObservableCollection<string>() { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
Combo_Imp_Value.ItemsSource = list_PhaseVal;

它在网格的第二列显示一个组合框,但没有值。

我该怎么做?

【问题讨论】:

  • 您是否编写过任何代码/尝试过先编写代码?如果从头开始,有很多示例可以帮助您入门,例如stackoverflow.com/questions/5409259/…
  • 给一段XAML或C#代码,方便大家给出解决方案

标签: c# wpf datagrid


【解决方案1】:

在代码中创建一个 ComboBoxColumn 并将项目动态绑定到它。 下面是一个示例代码。希望对你有帮助

DataGridComboBoxColumn combo = new DataGridComboBoxColumn();
string[] datasource = { "0", "1","2","3","4","5","6","7","8","9"};
combo.ItemsSource= datasource;
dataGrid1.Columns.Add(combo);

更新

根据您更新的问题陈述进行了一些新的更新。(如果有任何问题,请发表评论)

像这样替换DataGridComboBoxColumn

<DataGridTemplateColumn>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox x:Name="myCmb" Loaded="myCmb_Loaded" SelectedItem="{Binding Value}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>

在 CS 中

  private void myCmb_Loaded(object sender, RoutedEventArgs e)
        {
            ComboBox cmb = (ComboBox)sender;
            ObservableCollection<string> list_PhaseVal = new ObservableCollection<string>() { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
            cmb.ItemsSource = list_PhaseVal;
        }

【讨论】:

  • 这已经完成了。我已经更新了这个问题。请参考并提出您宝贵的建议。
  • @MohammadSherif 你是如何绑定你的 DataGrid “dg_phase_details”的,ItemsSource 是什么?
  • ds_Phases = DbHelper.getData("从 Phases 中选择 phase.Phase, details.Id, details.Imp_Value 作为阶段,Stake_Mem_Details 作为详细信息,其中 details.Phase_Id = phase.Id 和 details.Stake_Mem_Id = 1" ); dg_phase_details.ItemsSource = new DataView(ds_Phases.Tables[0]); ds_phases 是数据集 dg_phase_details 是数据网格
  • 是的...现在,当我双击单元格时,它会在组合框中显示值。但是当我选择一个选项并转到下一行时,它给了我错误 - 双向绑定需要 Path 或 XPath。
  • @Tushar Kukreti Thanx。现在工作正常。由于我已从 SelectedItem="{Binding Value}" 更改为 SelectedIndex="{Binding Imp_Value}" 而不是使用列表,我直接将组合框项目的值放在 xml 中。
【解决方案2】:

如果您的 DataGrid 的 ItemsSource 属性设置为 DataViewDataTable,则此 DataTable 应该有一列存储 ComboBox 的选定值。如果此列名为“YourColumn”,您可以将 ComboBox 的 SelectedItem 属性绑定到它,如下所示:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding YourColumn}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox x:Name="myCmb" Loaded="myCmb_Loaded" SelectedItem="{Binding YourColumn}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

如果DataTable中没有这样的列,你应该添加它:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("YourColumn"));
dg_phase_details.ItemsSource = dt.DefaultView;

所选值必须存储在某处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2017-08-05
    • 2018-01-22
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多