在我的XAML中,我有一个选择父元素的ComboBox。在ComboBox中选择一个项目时,应该用子元素填充DataGrid,这些子元素属于来自ComboBox的选择父元素(我希望这是有意义的)。
<!-- 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,这是我用以下方法设置的:
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事件中,但现在我看到了提供参数值的方法。
我能从代码背后做这个吗?
发布于 2017-07-11 08:38:51
我会这样执行:
视图模型
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
<!-- 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>发布于 2017-07-11 09:32:42
在视图模型中添加一个ContactGroup属性,并在此模型的setter中执行命令或直接调用ListContactGroups()方法:
private int _contactGroup;
public int ContactGroup
{
get { return _contactGroup; }
set
{
_contactGroup = value;
ListContactGroups();
}
}这应该可以工作,因为您正在将ComboBox的ComboBox属性绑定到XAML中的ContactGroup:
SelectedValue="{Binding ContactGroup}" />这意味着,无论何时在ComboBox中选择项,都将设置此属性。
https://stackoverflow.com/questions/45028898
复制相似问题