在 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; }
}

其次将你的DataGridDataSource绑定到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" //..
        });
    }
}