在 xamDataGrid 中填充 ComboBox
Populate ComboBox inside xamDataGrid
我有一个 xamDatagrid
设置如下:
<igDP:XamDataGrid DataSource="{Binding}" x:Name="xamContact" >
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
<igDP:Field Name="DepartmentName" Label="Department Name" />
<igDP:Field Name="FirstName" Width="100" Label="First Name" />
<igDP:Field Name="LastName" Label="Last Name" />
<igDP:Field Name="RoleName" Label="Role Name" />
<igDP:ComboBoxField Name="Contactby" Visibility="Visible" ItemsSource="{Binding}" Label="Contactby"></igDP:ComboBoxField>
<igDP:Field Name="ContactType" Label="ContactType" Visibility="Collapsed" />
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
在后面的代码中,我想填充 xamDataGrid
包括 ComboBox
字段 "Contactby"(位于 xamDataGrid 中),如下所示:
public DataTable GetContTable()
{
DataTable tableCont = new DataTable();
tableCont.Columns.Add("DepartmentName", typeof(string));
tableCont.Columns.Add("FirstName", typeof(string));
tableCont.Columns.Add("LastName", typeof(string));
tableCont.Columns.Add("RoleName", typeof(string));
tableCont.Columns.Add("Contactby", typeof(object));
tableCont.Columns.Add("ContactType", typeof(string));
tableCont.Columns[5].ColumnMapping = MappingType.Hidden;
return tableCont;
}
public void AddRowsCont(DataTable dtcont)
{
string[] card = new string[1000];
for (int i = 0; i < lstContactBy.Items.Count; i++)// in this listbox the number of items is dinamic then can change number each time insert a new record
{
card[i] = lstContactBy.Items[i].ToString();
}
dtcont.Rows.Add(txtDepartment.Text, txtFirstName.Text, txtlastName.Text, txtROlename.Text,card ,"SKYPE");
}
//here is the button to insert the data in the xamfdatagrid
AddRowsCont(tableCont);
xamContact.DataSource = tableCont.DefaultView;
结果是可以填充 xamdatagrid,而不是 ComboBox
"Contactby" 仅使用消息“String[] Array
”填充
我如何填充 ComboBox
而不会出现任何错误?
首先 我认为如果你定义一个模型 class 并以此为基础工作会更加优雅,比如说 class Item
:
public class Item
{
public String DepartmentName { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String RoleName { get; set; }
public String Contactby { get; set; }
public String ContactType { get; set; }
}
其次将你的DataGrid
DataSource
绑定到ObservableCollection
并实现INotifyChangedInterface
,这样你就不会每次集合中的项目或其自身发生更改时都需要注意更新 DataGrid
,因此在您的代码后面(或 ViewModel):
private ObservableCollection<Item> _listDg = new ObservableCollection<Item>();
public ObservableCollection<Item> ListDg
{
get
{
return _listDg;
}
set
{
if (_listDg == value)
{
return;
}
_listDg = value;
OnPropertyChanged();
}
}
关于 DataGrid
中的 ComboBoxField
,最好的处理方法是:
1. 创建另一个包含 ComboBoxField
项的集合,您也可以将该集合绑定到另一个 listView
以便每次添加ComboBoxField
上的集合列表中的项目也将更新,
private ObservableCollection<String> _contactByCollection = new ObservableCollection<string>()
{
"One","Two","Three" // you can Bind that collection to a list or add their items programaticlly
};
public ObservableCollection<String> ContactByCollection
{
get
{
return _contactByCollection;
}
set
{
if (_contactByCollection == value)
{
return;
}
_contactByCollection = value;
OnPropertyChanged();
}
}
2. 将该集合绑定到 CollectionViewSource
,并使用它来设置 comboBox
ItemSource
:
<Window.Resources>
<CollectionViewSource x:Key="list" Source="{Binding ContactByCollection}"/>
</Window.Resources>
最后,设置 DataGrid
DataSource
和页面 DataContext
<Window
...
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<CollectionViewSource x:Key="list" Source="{Binding ContactByCollection}"/>
</Window.Resources>
<Grid>
<igDP:XamDataGrid DataSource="{Binding ListDg}" x:Name="xamContact" BindToSampleData="True" IsSynchronizedWithCurrentItem="False" IsNestedDataDisplayEnabled="True" >
<igDP:XamDataGrid.ViewSettings>
<igDP:GridViewSettings/>
</igDP:XamDataGrid.ViewSettings>
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
<igDP:Field Name="DepartmentName" Label="Department Name" />
<igDP:Field Name="FirstName" Width="100" Label="First Name" />
<igDP:Field Name="LastName" Label="Last Name" />
<igDP:Field Name="RoleName" Label="Role Name" />
<igDP:ComboBoxField Name="Contactby" ItemsSource="{Binding Source={StaticResource list}}" Visibility="Visible" Label="Contact by">
</igDP:ComboBoxField>
<igDP:Field Name="ContactType" Label="ContactType" Visibility="Collapsed" />
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid>
</Grid>
这里有一个更详细的例子,ContactBy
项目在 ListView
Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<CollectionViewSource x:Key="list" Source="{Binding ContactByCollection}"/>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<Button Click="ButtonBase_OnClick" Content="Add new ContactBy Item"/>
<ListView ItemsSource="{Binding ContactByCollection}" Margin="3">
</ListView>
</StackPanel>
<StackPanel Grid.Column="1">
<igDP:XamDataGrid DataSource="{Binding ListDg}" x:Name="xamContact" BindToSampleData="True" IsSynchronizedWithCurrentItem="False" IsNestedDataDisplayEnabled="True" >
<igDP:XamDataGrid.ViewSettings>
<igDP:GridViewSettings/>
</igDP:XamDataGrid.ViewSettings>
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
<igDP:Field Name="DepartmentName" Label="Department Name" />
<igDP:Field Name="FirstName" Width="100" Label="First Name" />
<igDP:Field Name="LastName" Label="Last Name" />
<igDP:Field Name="RoleName" Label="Role Name" />
<igDP:ComboBoxField Name="Contactby" ItemsSource="{Binding Source={StaticResource list}}" Visibility="Visible" Label="Contact by">
</igDP:ComboBoxField>
<igDP:Field Name="ContactType" Label="ContactType" Visibility="Collapsed" />
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid>
<Button Content="Add an Item To the Grid" Click="AddToGrid_Click"></Button>
</StackPanel>
</Grid>
和代码隐藏
public class Item
{
public String DepartmentName { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String RoleName { get; set; }
public String Contactby { get; set; }
public String ContactType { get; set; }
}
public partial class MainWindow : Window, INotifyPropertyChanged
{
private ObservableCollection<String> _contactByCollection = new ObservableCollection<string>()
{
"One","Two","Three" // you can Bind that collection to a list or add their items programaticlly
};
public ObservableCollection<String> ContactByCollection
{
get
{
return _contactByCollection;
}
set
{
if (_contactByCollection == value)
{
return;
}
_contactByCollection = value;
OnPropertyChanged();
}
}
private ObservableCollection<Item> _listDg = new ObservableCollection<Item>();
public ObservableCollection<Item> ListDg
{
get
{
return _listDg;
}
set
{
if (_listDg == value)
{
return;
}
_listDg = value;
OnPropertyChanged();
}
}
public MainWindow()
{
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
ContactByCollection.Add("NewContactByItem");
}
private void AddToGrid_Click(object sender, RoutedEventArgs e)
{
ListDg.Add(new Item()
{
FirstName = "FirstName" //Other properties
,Contactby = "Three" //..
});
}
}
我有一个 xamDatagrid
设置如下:
<igDP:XamDataGrid DataSource="{Binding}" x:Name="xamContact" >
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
<igDP:Field Name="DepartmentName" Label="Department Name" />
<igDP:Field Name="FirstName" Width="100" Label="First Name" />
<igDP:Field Name="LastName" Label="Last Name" />
<igDP:Field Name="RoleName" Label="Role Name" />
<igDP:ComboBoxField Name="Contactby" Visibility="Visible" ItemsSource="{Binding}" Label="Contactby"></igDP:ComboBoxField>
<igDP:Field Name="ContactType" Label="ContactType" Visibility="Collapsed" />
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
在后面的代码中,我想填充 xamDataGrid
包括 ComboBox
字段 "Contactby"(位于 xamDataGrid 中),如下所示:
public DataTable GetContTable()
{
DataTable tableCont = new DataTable();
tableCont.Columns.Add("DepartmentName", typeof(string));
tableCont.Columns.Add("FirstName", typeof(string));
tableCont.Columns.Add("LastName", typeof(string));
tableCont.Columns.Add("RoleName", typeof(string));
tableCont.Columns.Add("Contactby", typeof(object));
tableCont.Columns.Add("ContactType", typeof(string));
tableCont.Columns[5].ColumnMapping = MappingType.Hidden;
return tableCont;
}
public void AddRowsCont(DataTable dtcont)
{
string[] card = new string[1000];
for (int i = 0; i < lstContactBy.Items.Count; i++)// in this listbox the number of items is dinamic then can change number each time insert a new record
{
card[i] = lstContactBy.Items[i].ToString();
}
dtcont.Rows.Add(txtDepartment.Text, txtFirstName.Text, txtlastName.Text, txtROlename.Text,card ,"SKYPE");
}
//here is the button to insert the data in the xamfdatagrid
AddRowsCont(tableCont);
xamContact.DataSource = tableCont.DefaultView;
结果是可以填充 xamdatagrid,而不是 ComboBox
"Contactby" 仅使用消息“String[] Array
”填充
我如何填充 ComboBox
而不会出现任何错误?
首先 我认为如果你定义一个模型 class 并以此为基础工作会更加优雅,比如说 class Item
:
public class Item
{
public String DepartmentName { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String RoleName { get; set; }
public String Contactby { get; set; }
public String ContactType { get; set; }
}
其次将你的DataGrid
DataSource
绑定到ObservableCollection
并实现INotifyChangedInterface
,这样你就不会每次集合中的项目或其自身发生更改时都需要注意更新 DataGrid
,因此在您的代码后面(或 ViewModel):
private ObservableCollection<Item> _listDg = new ObservableCollection<Item>();
public ObservableCollection<Item> ListDg
{
get
{
return _listDg;
}
set
{
if (_listDg == value)
{
return;
}
_listDg = value;
OnPropertyChanged();
}
}
关于 DataGrid
中的 ComboBoxField
,最好的处理方法是:
1. 创建另一个包含 ComboBoxField
项的集合,您也可以将该集合绑定到另一个 listView
以便每次添加ComboBoxField
上的集合列表中的项目也将更新,
private ObservableCollection<String> _contactByCollection = new ObservableCollection<string>()
{
"One","Two","Three" // you can Bind that collection to a list or add their items programaticlly
};
public ObservableCollection<String> ContactByCollection
{
get
{
return _contactByCollection;
}
set
{
if (_contactByCollection == value)
{
return;
}
_contactByCollection = value;
OnPropertyChanged();
}
}
2. 将该集合绑定到 CollectionViewSource
,并使用它来设置 comboBox
ItemSource
:
<Window.Resources>
<CollectionViewSource x:Key="list" Source="{Binding ContactByCollection}"/>
</Window.Resources>
最后,设置 DataGrid
DataSource
和页面 DataContext
<Window
...
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<CollectionViewSource x:Key="list" Source="{Binding ContactByCollection}"/>
</Window.Resources>
<Grid>
<igDP:XamDataGrid DataSource="{Binding ListDg}" x:Name="xamContact" BindToSampleData="True" IsSynchronizedWithCurrentItem="False" IsNestedDataDisplayEnabled="True" >
<igDP:XamDataGrid.ViewSettings>
<igDP:GridViewSettings/>
</igDP:XamDataGrid.ViewSettings>
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
<igDP:Field Name="DepartmentName" Label="Department Name" />
<igDP:Field Name="FirstName" Width="100" Label="First Name" />
<igDP:Field Name="LastName" Label="Last Name" />
<igDP:Field Name="RoleName" Label="Role Name" />
<igDP:ComboBoxField Name="Contactby" ItemsSource="{Binding Source={StaticResource list}}" Visibility="Visible" Label="Contact by">
</igDP:ComboBoxField>
<igDP:Field Name="ContactType" Label="ContactType" Visibility="Collapsed" />
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid>
</Grid>
这里有一个更详细的例子,ContactBy
项目在 ListView
Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<CollectionViewSource x:Key="list" Source="{Binding ContactByCollection}"/>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<Button Click="ButtonBase_OnClick" Content="Add new ContactBy Item"/>
<ListView ItemsSource="{Binding ContactByCollection}" Margin="3">
</ListView>
</StackPanel>
<StackPanel Grid.Column="1">
<igDP:XamDataGrid DataSource="{Binding ListDg}" x:Name="xamContact" BindToSampleData="True" IsSynchronizedWithCurrentItem="False" IsNestedDataDisplayEnabled="True" >
<igDP:XamDataGrid.ViewSettings>
<igDP:GridViewSettings/>
</igDP:XamDataGrid.ViewSettings>
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
<igDP:Field Name="DepartmentName" Label="Department Name" />
<igDP:Field Name="FirstName" Width="100" Label="First Name" />
<igDP:Field Name="LastName" Label="Last Name" />
<igDP:Field Name="RoleName" Label="Role Name" />
<igDP:ComboBoxField Name="Contactby" ItemsSource="{Binding Source={StaticResource list}}" Visibility="Visible" Label="Contact by">
</igDP:ComboBoxField>
<igDP:Field Name="ContactType" Label="ContactType" Visibility="Collapsed" />
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid>
<Button Content="Add an Item To the Grid" Click="AddToGrid_Click"></Button>
</StackPanel>
</Grid>
和代码隐藏
public class Item
{
public String DepartmentName { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String RoleName { get; set; }
public String Contactby { get; set; }
public String ContactType { get; set; }
}
public partial class MainWindow : Window, INotifyPropertyChanged
{
private ObservableCollection<String> _contactByCollection = new ObservableCollection<string>()
{
"One","Two","Three" // you can Bind that collection to a list or add their items programaticlly
};
public ObservableCollection<String> ContactByCollection
{
get
{
return _contactByCollection;
}
set
{
if (_contactByCollection == value)
{
return;
}
_contactByCollection = value;
OnPropertyChanged();
}
}
private ObservableCollection<Item> _listDg = new ObservableCollection<Item>();
public ObservableCollection<Item> ListDg
{
get
{
return _listDg;
}
set
{
if (_listDg == value)
{
return;
}
_listDg = value;
OnPropertyChanged();
}
}
public MainWindow()
{
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
ContactByCollection.Add("NewContactByItem");
}
private void AddToGrid_Click(object sender, RoutedEventArgs e)
{
ListDg.Add(new Item()
{
FirstName = "FirstName" //Other properties
,Contactby = "Three" //..
});
}
}