2009-03-20 4 views
2

У меня есть два списка, оба используют Extended SelectionMode. Элемент ItemsSource является List и использует таблицу данных. Я пытаюсь использовать агрегирование некоторого свойства из первого как источник items для второго. Например:WPF: агрегирование свойств в ListBox

public class MultiAppPropertyAggregator : IValueConverter { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
    IList<SomeObject> selectedItems = value as IList<SomeObject>; 
    Dictionary<string, string> bundles = new Dictionary<string,string>(); 
    foreach(SomeObject myobj in selectedItems) { 
     foreach(KeyValuePair<string,string> name in myobj.Names) { 
      selectedItems.Add(name.Key, name.Value); 
.... 

<ListBox x:Name="lstApplication" ItemsSource="{Binding}" SelectionChanged="lstApplication_SelectionChanged" SelectionMode="Extended" /> 
<ListBox x:Name="lstBundles" ItemsSource="{Binding ElementName=lstApplication,Path=SelectedItems,Mode=OneWay,Converter={StaticResource MultiAppPropertyAggregator}}" ItemTemplate="{StaticResource DictionaryList}" SelectedValuePath="Key" SelectionMode="Extended" /> 

Таким образом, объекты в первом списке содержат свойство типа Dictionary. Я хочу добавить все элементы в словарях всех выбранных элементов в первом списке во второй список.

Конвертер, кажется, вызывается при начальной загрузке, а затем снова после этого, и я получаю пустой второй список. Я что-то упускаю?

ответ

0

Я бы предположил, что ваш конвертер вызывается только один раз, потому что SelectedItems в списке не является DependencyProperty и, следовательно, не будет уведомлять привязанность, которую он обновил.

Возможно, вам лучше сделать это преобразование в вашей кодовой/обзорной модели (в зависимости от используемой вами методологии) и разоблачить свойство для второго списка, к которому нужно привязать.

Вы можете сделать это одним из двух способов, о которых я могу думать. Сначала вы можете прослушать SelectionChanged в первом списке и обновить свойство, которому привязан второй список. Или вы можете поместить свойство IsSelected на элементы, к которым привязан первый список, и обновить свой второй список, если это изменится в любом заданном элементе. Вы можете добавить этот стиль для ListBoxItem для синхронизации IsSelected свойства между элементом данных и видом:

<Style TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/> 
</Style> 

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

+0

Спасибо, первый способ прослушивания события SelectionChanged и установка ItemsSource каждый раз отлично работает. – Echilon

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