Question

J'ai deux ListBoxes, les deux utilisent SelectionMode Extended. Le ItemsSource de la première est une liste, et utilise un DataTemplate. Je suis en train d'utiliser une agrégation de certains biens de la première comme ItemsSource pour le second. Par exemple:

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 dans la première liste contiennent une propriété de type dictionnaire. Je veux ajouter dans la première liste à la deuxième liste tous les articles dans les dictionnaires de tous les éléments sélectionnés.

Le convertisseur semble être appelé la charge initiale, pas après ça et je finis avec une seconde zone de liste vide. Est-ce que je manque quelque chose?

Était-ce utile?

La solution

Je suppose que vous êtes convertisseur est uniquement appelé une fois parce SelectedItems sur une zone de liste n'est pas un DependencyProperty et, par conséquent, ne sera pas notifier la liaison qu'il a mis à jour.

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

Vous pouvez le faire de deux façons que je peux penser. Tout d'abord, vous pouvez écouter SelectionChanged sur la première liste et mettre à jour la propriété que la deuxième liste est lié. Ou bien, vous pouvez mettre IsSelected propriété sur les éléments que la première liste est lié à et mettre à jour votre deuxième liste lorsque cela change sur un élément donné. Vous pouvez ajouter ce style pour ListBoxItem synchroniser 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 ne peut pas totalement en prise avec l'interface utilisateur quelle que soit la méthode que vous suivez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top