我已通过名称表在datattable
中创建了一个组合框列,如下所示
table.Columns.Add("Signals", typeof(ComboBox));
我有一个Combobox:
ComboBox cmbBox = new ComboBox();
现在对这个组合框我正在添加从字符串列表中读取的项目:
foreach (ObjectItem item in objClsSignal.lstTerminalLevel1)
{
cmbBox.Items.Add(item.FullName);
}
lstTerminalLevel1
是Objectitems
的列表,从这个对象项我正在读取对象的名称并将其添加到组合框中。
然后我将组合框作为新行添加到数据表"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
等......但我想要的是存储在组合框中的内容..
关于如何去做的任何想法?
答案 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;