我有一个ListView,它包含一个名称列表,每个名称来自一个绑定到包含“name”字段的对象,如下所示:
public class User {
public User() {}
public User(string name, int ID) {
this.name = name;
this.ID = ID;
}
public string name {set; get;}
public int ID {set; get;}
}
和listView:
<ListView Margin="10" Name="lvName" DisplayMemberPath="name"/>
并且在后面的代码中我将lvName.ItemSource设置为User对象的ObservableCollection,在集合中我拥有可以具有相同Name但不具有相同ID的Users。
我还有一个dataGrid,定义了2列(一个用于名称,一个用于ID),我想这样做,以便当用户从列表视图中选择一行(显示用户名)时,数据网格会填充所有与列表视图中选择的名称相同的用户对象(名称和ID)。
我该怎么做?
注意:我设法将名称字段绑定到文本块,方法如下:
Text="{Binding SelectedItem.name, ElementName=lvName}"
但我不知道如何在数据网格上执行此操作,更不用说ID字段以及名称字段了。
答案 0 :(得分:0)
这可以使用MVVM方法轻松完成。
假设,User
类看起来像这样:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
您可以定义此视图模型:
public class ViewModel
{
public ViewModel()
{
Users = new ObservableCollection<User>
{
new User { Id = 1, Name = "John" },
new User { Id = 2, Name = "Mary" },
new User { Id = 3, Name = "Peter" },
new User { Id = 4, Name = "John" },
new User { Id = 5, Name = "John" },
new User { Id = 5, Name = "Peter" }
};
UsersView = new ListCollectionView(Users)
{
Filter = obj =>
{
var user = (User)obj;
return SelectedUser != null && user.Name == SelectedUser.Name && user.Id != selectedUser.Id;
}
};
}
public ObservableCollection<User> Users { get; private set; }
public ICollectionView UsersView { get; set; }
public User SelectedUser
{
get { return selectedUser; }
set
{
if (selectedUser != value)
{
selectedUser = value;
UsersView.Refresh();
}
}
}
private User selectedUser;
}
XAML:
<StackPanel>
<ListView DisplayMemberPath="Name" ItemsSource="{Binding Users}" SelectedItem="{Binding SelectedUser}"/>
<DataGrid ItemsSource="{Binding UsersView}"/>
</StackPanel>
结果: