将Combobox添加到Datatable作为其列之一并将此数据表绑定到datatgrid

时间:2015-12-01 14:40:54

标签: wpf c#-4.0

我已通过名称表在datattable中创建了一个组合框列,如下所示

table.Columns.Add("Signals", typeof(ComboBox));           

我有一个Combobox:

ComboBox cmbBox = new ComboBox();

现在对这个组合框我正在添加从字符串列表中读取的项目:

foreach (ObjectItem item in objClsSignal.lstTerminalLevel1)
{
cmbBox.Items.Add(item.FullName);

}

lstTerminalLevel1Objectitems的列表,从这个对象项我正在读取对象的名称并将其添加到组合框中。 然后我将组合框作为新行添加到数据表"table"

table.Rows.Add(cmbBox);

他们我正在将数据表biunding到datagrid,如下所示:

dataGrid1.ItemsSource = table.DefaultView;

我得到的输出是:

System.Windows.Controls.ComboBox Items.Count:2
System.Windows.Controls.ComboBox Items.Count:1

等......但我想要的是存储在组合框中的内容..

关于如何去做的任何想法?

1 个答案:

答案 0 :(得分:1)

WPF具有单独的UI和数据层。

写作时

dataGrid1.ItemsSource = table.DefaultView;

它的意思是

  

对于table.DefaultView中的每个DataGridRow,创建一个<DataGridRow>   在dataGrid1中,将该行后面的DataContext设置为   DataRow对象

所呈现的是

<DataGrid>
    <DataRow DataContext=table[0] />
    <DataRow DataContext=table[1] />
</DataGrid>

如果你没有告诉DataGrid以任何特定的方式绘制它的行,它将使用默认值,即为DataContext对象中的每个属性创建一个Column,每个单元格将是一个{ {1}} TextBlock属性显示每个值的.Text

所以你看到的是

.ToString()

如果要在那里显示ComboBox,则需要告诉DataGrid如何绘制该单元格。例如,

<DataGrid>
    <DataRow DataContext=table[0]>
        <DataGridCell>
            <TextBlock Text=table[0].ToString() />
        </DataGridCell>
    </DataRow>
    <DataRow DataContext=table[1]>
        <DataGridCell>
            <TextBlock Text=table[1].ToString() />
        </DataGridCell>
    </DataRow>
</DataGrid>

现在它会像这样呈现:

<DataGrid Name="dataGrid1" AutoGenerateColumns="False">
    <DataGrid.Columns>           
        <DataGridComboBoxColumn SelectedItem="{Binding }" />
    </DataGrid.Columns>
</DataGrid>

当然,您还需要设置ComboBox的ItemsSource属性,以便它具有可供选择的值。在这一点上,我只是说废弃你正在做的事情并为WPF正确构建它。

创建一个类来保存Grid中显示的每个项目的数据

<DataGrid>
    <DataRow DataContext=table[0]>
        <DataGridCell>
            <ComboBox SelectedItem=table[0] />
        </DataGridCell>
    </DataRow>
    <DataRow DataContext=table[1]>
        <DataGridCell>
            <ComboBox SelectedItem=table[1] />
        </DataGridCell>
    </DataRow>
</DataGrid>

为网格数据创建包含public class MyObject() { public string FullName { get; set; } } 的{​​{1}},为ComboBox项目数据创建单独的ViewModel

ObservableCollection<MyObject>

(我正在使用ObservableCollection<string>代替public class MyViewModel { public ObservableCollection<MyObject> MyGridData { get; set; } public ObservableCollection<string> AllNames { get; set; } } ,因为它会在项目添加或从集合中删除时自动更新UI

使用您的数据填充ObservableCollection

List

设置(或绑定)DataGrid的DataContext

MyViewModel

并设置如何绘制每个项目

var vm = new MyViewModel();
vm.MyGridData = new ObservableCollection<MyObject>();
vm.AllNames = new ObservableCollection<string>();

foreach (ObjectItem item in objClsSignal.lstTerminalLevel1)
{
    vm.MyGridData.Add(new MyObject() { FullName = item.FullName });
    if (!vm.AllNames.Contains(item.FullName))
        vm.AllNames.Add(item.FullName);
}

呈现的是:

dataGrid1.DataContext = vm;