首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ComboBox为DataGrid选择数据

使用ComboBox为DataGrid选择数据
EN

Stack Overflow用户
提问于 2017-07-11 08:10:30
回答 2查看 139关注 0票数 0

在我的XAML中,我有一个选择父元素的ComboBox。在ComboBox中选择一个项目时,应该用子元素填充DataGrid,这些子元素属于来自ComboBox的选择父元素(我希望这是有意义的)。

代码语言:javascript
复制
<!-- Select here to populate datagrid -->
<ComboBox ItemsSource="{Binding ContactGroups}"
          DisplayMemberPath="Name"
          SelectedValuePath="Id"
          SelectedValue="{Binding ContactGroup}" />

<!-- ComboBox selection loads data to the grid -->
<DataGrid ItemsSource={Binding Contacts}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding FirstName}" Header="First Name" />
        <DataGridTextColumn Binding="{Binding LastName}" Header="Last Name" />
    </DataGrid.Columns>
</DataGrid>

我本来只想使用数据库和ViewModel来完成这个任务,但老实说,我不知道如何将选定的ContactGroup Id传递给我的ViewModel,这是我用以下方法设置的:

代码语言:javascript
复制
public class ContactsViewModel
{
    private readonly ObservableCollection<Contact> _Contacts
        = new ObservableCollection<Contact>();
    public IEnumerable<Contact> Contacts
    {
        get { return _Contacts; }
    }

    private ObservableCollection<ContactGroup> _ContactGroups 
        = new ObservableCollection<ContactGroup>();
    private IEnumerable<ContactGroup> ContactGroups
    {
        get { return _ContactGroupsViewModel; }
    }

    // Binding for ContactGroups ComboBox
    public ICommand ListContactGroupsCommand
    {
        get
        {
            return new MyDelegateCommand(ListContactGroups);
        }
    }
    private void ListContactGroups()
    {
        using (ApplicationDbContext Context = new ApplicationDbContext())
        {
            var ContactGroups = Context.ContactGroups.Where
            (
                x => x.Deleted == false
            );

            foreach (var c in ContactGroups)
            {
                AddToContactGroups(c);
            }
        }
    }
    private void AddToContactGroups(ContactGroup group)
    {
        if (!_ContactGroups.Contains(group))
            _ContactGroups.Add(group);
    }

    // Handle selection of a ContactGroup.
    public ICommand ListContactsForGroupCommand
    {
        get
        {
            return new MyDelegateCommand((ContactGroupId) =>
                { ListContacts((int)ContactGroupId); });
        }
    }

   private void ListContacts(int contactGroupId)
    {
        using (ApplicationDbContext db = new ApplicationDbContext())
        {
            var Contacts = db.Contacts.Where
            (
                x => x.ContactGroupId == contactGroupId &&
                x.Deleted == false
            );
            foreach (var c in Contacts)
            {
                AddToContacts(c);
            }
        }
    }
    private void AddToContacts(Contact contact)
    {
        if (!_Contacts.Contains(contact))
            _Contacts.Add(contact);
    }
}

如何在ListContactsForGroupCommand上执行ComboBox?

我想我可以将它连接到SelectionChanged事件中,但现在我看到了提供参数值的方法。

我能从代码背后做这个吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-11 08:38:51

我会这样执行:

视图模型

代码语言:javascript
复制
public class ContactsViewModel
{    
    public IEnumerable<Contact> Contacts
    {
        get 
        { 
            return db.Contacts.Where
            (
                x => x.ContactGroupId == ContactGroup.Id &&
                x.Deleted == false
            ); 
        }
    }

    private ContactGroup _contactGroup = new ContactGroup();
    private ContactGroup ContactGroup
    {
        get { return _contactGroup; }
        set
        {
            _contactGroup = value;
            RaisePropertyChangedEvent("ContactGroup");
            RaisePropertyChangedEvent("Contacts");
        }
    }  

    private ObservableCollection<ContactGroup> _ContactGroups 
    = new ObservableCollection<ContactGroup>();
    private IEnumerable<ContactGroup> ContactGroups
    {
        get { return _ContactGroupsViewModel; }
    }  
}

XAML

代码语言:javascript
复制
<!-- Select here to populate datagrid -->
<ComboBox ItemsSource="{Binding ContactGroups}"
          DisplayMemberPath="Name"
          SelectedItem="{Binding ContactGroup}" />

<!-- ComboBox selection loads data to the grid -->
<DataGrid ItemsSource={Binding Contacts}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding FirstName}" Header="First Name" />
        <DataGridTextColumn Binding="{Binding LastName}" Header="Last Name" />
    </DataGrid.Columns>
</DataGrid>
票数 1
EN

Stack Overflow用户

发布于 2017-07-11 09:32:42

在视图模型中添加一个ContactGroup属性,并在此模型的setter中执行命令或直接调用ListContactGroups()方法:

代码语言:javascript
复制
private int _contactGroup;
public int ContactGroup
{
    get { return _contactGroup; }
    set
    {
        _contactGroup = value;
        ListContactGroups();
    }
}

这应该可以工作,因为您正在将ComboBoxComboBox属性绑定到XAML中的ContactGroup

代码语言:javascript
复制
SelectedValue="{Binding ContactGroup}" />

这意味着,无论何时在ComboBox中选择项,都将设置此属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45028898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档