使用itemssource绑定c#和xaml时如何在数据网格中放置combox

时间:2013-11-19 09:54:50

标签: c# xaml

我希望jobrole和jobtitle成为comboxes和button。 因为它是使用itemsource绑定生成的,而列表是在c#中生成的。 我找不到一种方法可以说出该列名是否是Jobrole然后制作一个组合框或其他一些我不知道的方法。

如果可能的话,如何使列只能读取。

<Grid>
    <DataGrid ItemsSource="{Binding ContactList}" SelectedItem="{Binding SelectedContact}"/>
</Grid>

如果你需要它,这就是我的数据网格组成的地方。

public static ObservableCollection<ContactPerson> getContactPerson()
        {
            ObservableCollection<ContactPerson> contactPersons = new ObservableCollection<ContactPerson>();

            try
            {
                doc.Load("Database/contactpersoon.xml");
            }
            catch (Exception e)
            {
                throw;
            }

                XmlNodeList elemList = doc.GetElementsByTagName("contact");
                for (int i = 0; i < elemList.Count; i++)
                {
                    ContactPerson contactPerson = new ContactPerson();
                    contactPerson.ID = i.ToString();
                    contactPerson.Name = elemList[i]["name"].InnerText;
                    contactPerson.Company = elemList[i]["company"].InnerText;
                    contactPerson.City = elemList[i]["city"].InnerText;
                    contactPerson.Email = elemList[i]["email"].InnerText;
                    contactPerson.Phone = elemList[i]["phone"].InnerText;
                    contactPerson.Cellphone = elemList[i]["cellphone"].InnerText;
                    contactPerson.JobRole = new ContactPersonType
                    {
                        ID = i.ToString(),
                        Name = elemList[i]["jobrole"].InnerText
                    };
                    contactPerson.JobTitle = new ContactPersonTitle
                    {
                        ID = i.ToString(),
                        Name = elemList[i]["title"].InnerText
                    };

                    ContactPersonTitle.invullenContactPersonTitle(i.ToString(), contactPerson.JobTitle.Name);

                    contactPersons.Add(contactPerson);
                }

            return contactPersons;
        }

    public override string ToString()
    {
        return ID + " " + Name + " " + Company + " " + JobRole +" " + JobTitle + " " + City +" " + Email + " " + Phone + " " + Cellphone;
    }

感谢

1 个答案:

答案 0 :(得分:0)

您可以使用DataGridComboBoxColumn。像这样:

<DataGrid.Columns>
    <DataGridComboBoxColumn Header="Job Title"
                            DisplayMemberPath="JobTitle.Name"
                            ItemsSource="{x:Static ContactPersonTitle.AvailableJobTitles}"
                            SelectedItemBinding="{Binding JobTitle}"/>
</DataGrid.Columns>

但这意味着您需要为数据网格设置AutoGenerateColumns="False",以便不生成此列。而这反过来意味着您需要设置所有其他列。

我在ContactPersonTitle对象上假设了一个静态属性(带有更改通知),因为那里已有静态方法。如果要使用视图模型中的列表,它应如下所示:

<DataGrid.Columns>
    <DataGridComboBoxColumn Header="Job Title"
                            DisplayMemberPath="JobTitle.Name"
                            ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,
                                                      AncestorType={x:Type UserControl}},
                                                  Path=DataContext.AvailableJobTitlesInViewModel}"
                            SelectedItemBinding="{Binding JobTitle}"/>
</DataGrid.Columns>

如果您需要更精确地控制数据的显示方式,可以使用DataGridTemplateColumn来设置CellTemplateCellEditingTemplate - 您可以自定义的数据模板您的需求。这些数据模板的数据上下文是行的项目,即您的案例中的ContactPerson