【问题标题】:Bind ListView selected item to a DataGrid将 ListView 选定项绑定到 DataGrid
【发布时间】:2015-10-23 10:46:19
【问题描述】:

我有一个包含名称列表的 ListView,每个名称都来自与包含“名称”字段的对象的绑定,如下所示:

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 Margin="10" Name="lvName" DisplayMemberPath="name"/>

在后面的代码中,我将 lvName.ItemSource 设置为用户对象的 ObservableCollection,在集合中,我有可以具有相同名称但 ID 不同的用户。

我还有一个 dataGrid,定义了 2 列(一列用于名称,一列用于 ID),我希望这样当用户从列表视图中选择一行(显示用户名称)时,数据网格将填充与在列表视图中选择的名称相同的所有用户对象(名称和 ID)。

我该怎么做?

注意:通过这样做,我设法将名称字段绑定到文本块:

 Text="{Binding SelectedItem.name, ElementName=lvName}"

但我不知道如何在数据网格上执行此操作,更不用说 ID 字段和名称字段了。

【问题讨论】:

    标签: c# wpf listview datagrid


    【解决方案1】:

    这可以使用 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>
    

    结果:

    【讨论】:

    • 太棒了,不幸的是我在这个项目中没有使用 MVVM 模式,没有它有没有办法做到这一点?
    • @Stacker:实际上,这里的视图模型只是 3 个属性的容器:源集合、其过滤视图和选定项。您可以将所有这些东西存储在代码后面,并使用ListView.SelectionChanged 事件而不是绑定。
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多