WPF: объединение свойств в ListBox

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

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. Я хочу добавить все элементы в словарях всех выбранных элементов в первом списке во второй список.

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


person Echilon    schedule 20.03.2009    source источник


Ответы (1)


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

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

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

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

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

person dustyburwell    schedule 20.03.2009
comment
Спасибо, первый метод прослушивания события SelectionChanged и установки ItemsSource каждый раз работает отлично. - person Echilon; 20.03.2009