2015-10-23 4 views
0

У меня есть ListView, который содержит список имен, каждое имя происходит от привязки к объекту, содержащему поле «имя», как это:Bind ListView выбранного элемента DataGrid

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 к ObservableCollection объектов пользователя, в коллекции у меня есть пользователи, которые могут иметь одинаковые имена, но не тот же идентификатор.

У меня также есть dataGrid с двумя определенными столбцами (один для имени и один для ID), я хочу сделать так, чтобы, когда пользователь выбирает строку из списка (которая показывает имена пользователей), datagrid будут заполнены всеми объектами User (как имя, так и идентификатор), которые имеют то же имя, которое было выбрано в списке.

как я могу это сделать?

Примечание: мне удалось связать имя поля к TextBlock, делая это:

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

, но я понятия не имею, как это сделать на сетке, не говоря уже с полем ID, а также поле имени.

ответ

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

+0

Это потрясающе, к сожалению, я не использую шаблон MVVM в этом проекте, есть ли способ сделать это без него? – Stacker

+0

@Stacker: фактически, модель просмотра - это всего лишь контейнер для 3 свойств: исходная коллекция, ее отфильтрованное представление и выбранный элемент. Вы можете хранить все это в коде позади и использовать событие «ListView.SelectionChanged» вместо привязки. – Dennis

Смежные вопросы