2009-03-20 8 views
2

J'ai deux ListBox, les deux utilisent Extended SelectionMode. Le ItemsSource du premier est une liste, et utilise un datatemplate. J'essaye d'utiliser une agrégation de certaines propriétés du premier comme itemsource pour le second. Par exemple:WPF: Agrégation de propriétés sur un 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" /> 

Ainsi, les objets de la première liste contiennent une propriété de type Dictionary. Je souhaite ajouter tous les éléments des dictionnaires de tous les éléments sélectionnés dans la première liste à la deuxième liste.

Le convertisseur semble être appelé en charge initiale, puis pas à nouveau après cela et je me retrouve avec une deuxième zone de liste vide. Est-ce que je manque quelque chose?

Répondre

0

Je suppose que votre convertisseur n'est appelé qu'une seule fois car SelectedItems sur une zone de liste n'est pas un DependencyProperty et, par conséquent, ne notifiera pas la liaison qu'il a mise à jour.

Vous feriez peut-être mieux de faire cette conversion dans votre codebehind/viewmodel (selon la méthodologie que vous suivez) et d'exposer une propriété pour la deuxième zone de liste à lier.

Vous pouvez le faire de deux façons que je peux penser. Tout d'abord, vous pouvez écouter SelectionChanged dans la première liste et mettre à jour la propriété à laquelle la deuxième liste est liée. Ou, vous pouvez mettre une propriété IsSelected sur les éléments auxquels la première liste est liée et mettre à jour votre deuxième liste lorsque cela change sur un élément donné. Vous pouvez ajouter ce style pour ListBoxItem synchroniser la IsSelected propriété entre l'élément de données et la vue:

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

Je pense que le premier sera moins difficile à mettre en œuvre, mais il engrène pas entièrement quelle que soit la méthodologie d'interface utilisateur que vous suivez.

+0

Merci, la première méthode d'écoute pour l'événement SelectionChanged et le réglage de ItemsSource chaque fois fonctionne parfaitement. – Echilon