WPF ListBox Multi-Select привязка - PullRequest
       0

WPF ListBox Multi-Select привязка

3 голосов
/ 18 января 2011

У меня есть два списка, один слева и один справа.Когда я выбираю элемент contactList в левом списке, информация о метке должна отображаться в правом списке, и эта часть работает нормально.Проблема, которую я имею, состоит в том, чтобы сделать с множественным выбором, потому что в настоящее время это только покажет информацию из одного выбора.Я изменил режим выбора в моем XAML на множественный выбор, но это не сработало.Буду признателен за любую помощь.Спасибо.

XAML

<Grid x:Name="LayoutRoot" Background="#FFCBD5E6">
    <ListBox x:Name="contactsList" SelectionMode="Multiple" Margin="7,8,0,7" ItemsSource="{Binding ContactLists, Mode=Default}" ItemTemplate="{DynamicResource ContactsTemplate}" HorizontalAlignment="Left" Width="254" SelectionChanged="contactsList_SelectionChanged"/>
    <ListBox x:Name="tagsList" Margin="293,8,8,8" ItemsSource="{Binding AggLabels, Mode=Default}" ItemTemplate="{StaticResource TagsTemplate}" Style="{StaticResource tagsStyle}" />
</Grid>

Код

private void contactsList_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        if (contactsList.SelectedItems.Count > 0)
        {
            CollectionViewGroup collectionView = contactsList.SelectedItems[0] as CollectionViewGroup;
            ContactList selectedContact = contactsList.SelectedItems[0] as ContactList;

            ObservableCollection<AggregatedLabel> labelList = new ObservableCollection<AggregatedLabel>();

            foreach (ContactList contactList in collectionView.Items)
            {
                foreach (AggregatedLabel aggLabel in contactList.AggLabels)
                {
                    labelList.Add(aggLabel);

                    tagsList.ItemsSource = labelList;

                }

            }
        }
    }

Ответы [ 2 ]

3 голосов
/ 18 января 2011

Я думаю, что все смущены этой частью

CollectionViewGroup collectionView = contactsList.SelectedItems[0] as CollectionViewGroup;
ContactList selectedContact = contactsList.SelectedItems[0] as ContactList;

вы смотрите только на первый выбранный элемент. (SelectedItems[0]), но рассматриваете это как одно или другое?

вам, вероятно, нужно что-то вроде

// only create the list once, outside all the loops
ObservableCollection<AggregatedLabel> labelList = new ObservableCollection<AggregatedLabel>();

foreach (var selected in contactsList.SelectedItems)
{
   // pretty much your existing code here, referencing selected instead of SelectedItems[0]
}

// only set the list once, outside all the loops
tagsList.ItemsSource = labelList;

в идеале, вы бы не устанавливали источник элементов в tagsList, у вас уже была бы эта привязка к коллекции, и вы просто заменяли бы содержимое в этом методе. (только один вызов, чтобы очистить коллекцию вверху, и нет вызова, чтобы установить ItemsSource, так как он уже был бы связан)

1 голос
/ 18 января 2011

Я не совсем понимаю, что вы там делаете со всем этим кодом, но то, как вы обычно подходите к описанному сценарию, привязывая второй ListBox непосредственно к первому, должно выглядеть примерно так:

<ListBox Name="ListBox1" ItemsSouce="{Binding SomeOriginalSource}" .../>
<ListBox ItemsSouce="{Binding ElementName=ListBox1, Path=SelectedItems}".../>

Редактировать: Затем вы можете использовать DataTemplate, который перечисляет внутренние коллекции (что, например, может привести к созданию ListBox, содержащего другие ListBoxes), или добавить конвертер в привязку, которая объединит внутренние коллекции в один коллекция, как отметил Джон Гарднер.

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