Отфильтровать ресурс элемента одного элемента управления с выбранным значением другого элемента управления в WPF - PullRequest
1 голос
/ 02 августа 2010

У меня есть поле со списком и список в окне WPF.

Источник элементов в выпадающем списке установлен в Список всех объектов Команды. Команда имеет 2 свойства (TeamId и TeamName).

Источник элемента списка установлен в Список всех объектов Player. Свойства игрока: PlayerId.

Я хотел бы отфильтровать список игроков в списке, чтобы в моем поле со списком отображались только те игроки, чей идентификатор команды соответствует идентификатору команды выбранного элемента.

Я бы предпочел сделать все это в XAML, но я не совсем уверен, каким будет правильный способ сделать это в C #. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 02 августа 2010

Я не уверен, что вы можете сделать это полностью в xaml, я думаю, что вам может понадобиться немного работы в другом месте. Вот как я это сделал для чего-то другого.

Оберните вашу коллекцию с помощью CollectionViewSource в вашем xaml (это делает коллекцию, которая имеет сортировку по определенному имени свойства):

        <CollectionViewSource x:Key="ViewName" Source="{Binding YourBinding}">
            <CollectionViewSource.SortDescriptions>
                <comp:SortDescription PropertyName="Name" Direction="Ascending" />
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>

где-то еще, свяжите свой просмотр списка, чтобы этот источник был в качестве источника элементов:

            <ListView x:Name="MyList" ItemsSource="{Binding Source={StaticResource ViewName}}" />

тогда где-то в коде, у меня есть мой слушатель изменения свойства текстового поля, но вы получите общее представление. Интерфейс ICollectionView имеет элемент фильтра, который вы можете использовать для фильтрации вещей.

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        var text = FilterTextBox.Text;
        var source = MyList.Items as ICollectionView;
        if (string.IsNullOrWhiteSpace(filter))
        {
            source.Filter = null;
        }
        else
        {
            source.Filter = delegate(object item)
            {
                var s = item as INamedItem;
                return s.Name.IndexOf(filter, StringComparison.CurrentCultureIgnoreCase) != -1;
            };
        }
    }
0 голосов
/ 02 августа 2010

Во-первых, измените все ваши связанные коллекции на ObservableCollection.

Затем, в выпадающем списке, привяжите SelectedValue к другому свойству в вашем DataContext типа Team (вы реализовали INotifyPropertyChanged, верно?).Когда SelectedValue изменяется, обновите связанную коллекцию ListBox отфильтрованным списком из коллекции всех игроков:

public ObservableCollection<Team> Teams { get;set;}
public ObservableCollection<Player> Players { get;set;}
private List<Player> AllPlayers {get;set}

public Team CurrentTeam 
{
  get
  {
    return this._currentTeam;
  }
  set
  {
    this._currentTeam = value;
    this.Players = new ObservableCollection(this.AllPlayers.Where(x => x.TeamId = this._currentTeam.TeamId));
    RaisePropertyChanged("CurrentTeam");
  }
}

Это самый быстрый и простой способ сделать это.Вероятно, вы могли бы достичь этого с помощью CollectionView, но я думаю, что это проще понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...