3 votes

WPF : Les SelectedItems de la ListBox ne sont pas mis à jour ou accumulés lorsque la sélection est modifiée

Je rencontre l'étrange phénomène. Si j'ai fait beaucoup de recherches sur le Web, je n'ai pas trouvé de solution. J'utilise WPF, le moteur VS2010. L'interface graphique se compose principalement de quatre ListBoxes.

La première ListBox est l'agrégation des succursales du Mart, la seconde ListBox est l'agrégation des produits tels que les fruits, la viande, les légumes et ainsi de suite qu'un Mart vend. La troisième ListBox est une sorte de marchandise Mart. (pomme, pêche, poire, melon...) La 4ème ListBox est l'agrégation d'un type de fruit sélectionné, par exemple, si la pomme est sélectionnée, cortland, crabapple, sansa, gala et ainsi de suite.

Au démarrage du programme, toutes les succursales de Mart sont affichées dans la 1ère ListBox, et si je sélectionne une succursale, la liste des marchandises vendues à Mart est affichée dans la 2ème ListBox.

De la même manière, un sous-genre de l'élément sélectionné est affiché dans la 3e et la 4e ListBox.

Les 1ere, 2e et 4e ListBox fonctionnent bien, mais la 3e ListBox présente une erreur. Je pense que la 2ième et la 3ième ListBox ont la même structure.

La 3ème ListBox ne peut pas mettre à jour le changement de l'élément sélectionné. Indépendamment du SelectionMode (Single, Multiple, Extend), SelectedItems de la 3'rd ListBox contient tous les éléments que j'ai sélectionnés. que j'ai sélectionnés. De plus, les SelectedItems de la 3'rd ListBox contiennent des éléments dupliqués.

Mais le déclenchement de l'événement SelectionChanged est bon. Seulement, SelectedItems ou SelectedItem est un problème.

Actuellement, pour réaliser cette fonction, j'utilise la voie de déviation. Après le déclenchement de SelectionChanged, je récupère AddedItems dans SelelctionChangedEventArgs. Donc, j'utilise AddedItems au lieu de SelectdItem comme SelectionMode = "Single".

J'ai essayé plusieurs suggestions, VirtualizingStackPanel.IsVirtualizing="False", IsSynchronizedWithCurrentItem="True", mais je ne trouve pas de solution. Je suis désolé, je ne peux pas servir tout le behindcode et ~ xaml. En fait, cette application est très grande. Donc, je ne peux pas le faire.

Et, je suis désolé, mon anglais est médiocre.

Branches

            <StackPanel Orientation="Vertical" Grid.Column="0">
                <Label HorizontalAlignment="Center">Goods</Label>
                <ListBox Name="lbLoadedGoods" Height="120" Margin="2" SelectionMode="Single" SelectionChanged="lbLoadedGoods_SelectionChanged"></ListBox>
            </StackPanel>
            <StackPanel Orientation="Vertical" Grid.Column="1" >
                <Label HorizontalAlignment="Center">ITEM</Label>
                <!-- ListBox Double Click Event Setter -->
                <ListBox Name="lbLoadedItems" Height="120" Margin="2" SelectionMode="Single" SelectionChanged="lbLoadedItems_SelectionChanged">
                    <ListBox.ItemContainerStyle>
                        <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem }}">
                            <EventSetter Event="MouseDoubleClick" Handler="lbLoadedItems_MouseDoubleClick"></EventSetter>
                        </Style>
                    </ListBox.ItemContainerStyle>
                </ListBox>
            </StackPanel>
        </Grid>
    </GroupBox>

    <Label Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center">SubItem</Label>
    <ListBox Name="lbSelectedSubItemData" Height="80" Grid.Column="0" Grid.Row="1" Margin="4">
        <!-- ListBox Double Click Event Setter -->
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
                <EventSetter Event="MouseDoubleClick" Handler="lbSelectedSubItemData_MouseDoubleClick"></EventSetter>
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>

</StackPanel>

   // public ObservableCollection<string> BranchList { get; private set; }
   // public ObservableCollection<Goods> GoodList { get; private set; }
   // public ObservableCollection<Items> ItemList { get; private set; }
   // private ObservableCollection<string> m_usbitemlist = new ObservableCollection<string>();
   // public ObservableCollection<string> SubItemList { get { return m_usbitemlist; } private set { m_usbitemlist = value; } }

    private void BindFabFileList()
    {
        lbBranches.ItemsSource = BranchList;
        lbLoadedGoods.ItemsSource = GoodList;
        lbLoadedItems.ItemsSource = ItemList;
    }

    private void lbLoadedGoods_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        ItemList = new ObservableCollection<Items>();

        // ItemList Add. From Selected Goods
    }

1voto

David Meredith Points 326

Vous définissez la référence de l'objet ItemList à une nouvelle instance, plutôt que de mettre à jour les éléments de la liste à laquelle WPF est déjà connecté. WPF se connecte automatiquement à l'événement CollectionChanged de ObservableCollection, mais il ne sait pas que vous avez changé la référence dans le code derrière. L'interface utilisateur est toujours connectée à l'ancien objet en mémoire.

Au lieu de :

ItemList = new ObservableCollection<Items>();
ItemList.Add(...);

Faites-le :

ItemList.Clear();
ItemList.Add(...);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X