WPF:ListBox SelectedItems在选择更改时未更新或正在累积

本文关键字:更新 ListBox SelectedItems 选择 WPF | 更新日期: 2023-09-27 18:29:11

我遇到了奇怪的现象。如果我做了大量的网络搜索,我就无法找到解决方案。我使用WPF,VS2010引擎。GUI主要由四个列表框组成。

第一个ListBox是沃尔玛分店的集合,第二个ListBox则是沃尔玛销售的水果、肉类、蔬菜等商品的集合。Third ListBox是一种Mart商品。(苹果,桃,peer,甜瓜…)4th ListBox是一种选定水果的集合,例如,如果选择了苹果,cortland,crabapple,sansa,gala等。

在启动程序时,All Mart Branch显示在第1个ListBox上,如果我选择一个分店,则在Mart销售的商品列表显示在第2个;第nd个列表框。

以同样的方式,所选项目的子种类显示在第3个列表框和第4个列表框上。

第1个、第2个、第4个列表框做得不错,但第3个列表框有错误。我认为2'rd和3'rd有相同的结构。

3'rd ListBox无法更新selecteditem更改。无论SelectionMode(Single、Multiple、Extend)如何,第3个ListBox的SelectedItems都具有所有项我已经选择了。此外,第3个ListBox.SelectedItems包含重复项。

但是,SelectionChanged事件触发是好的。仅SelectedItems或SelectedItem有问题。

目前,为了实现这个功能,我使用迂回的方式。在激发SelectionChanged之后,我捕获了SelelctionChangedEventArgs的AddedItems。因此,我使用AddedItems而不是SelectionItem="Single"

我尝试了很多建议,VirtualizingStackPanel。IsVirtualization="False",IsSynchronizedWithCurrentItem="True",但我找不到解决方案。很抱歉,我不能提供所有的behindcode和~xaml。实际上,这个应用程序很大。所以,我不能那样做。

很抱歉我的英语能力很差。

分支机构

            <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
    }

WPF:ListBox SelectedItems在选择更改时未更新或正在累积

您正在将对对象ItemList的引用设置为一个新实例,而不是更新WPF已经连接到的列表上的项。WPF自动连接到ObservableCollection的CollectionChanged事件,但它不知道您已经更改了代码后面的引用。UI仍然连接到内存中的旧对象。

代替:

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

这样做:

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