将ListView选定项绑定到DataGrid

时间:2015-10-23 10:46:20

标签: c# wpf listview datagrid

我有一个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字段以及名称字段了。

1 个答案:

答案 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>

结果:

enter image description here