【问题标题】:WPF : ListBox SelectedItems not updating or being accumulated when selection changedWPF:选择更改时ListBox SelectedItems未更新或累积
【发布时间】:2013-08-28 03:01:16
【问题描述】:

我遇到了奇怪的现象。如果我做了很多网络搜索,我无法得到解决方案。 我使用 WPF,VS2010 引擎。 GUI 主要由四个 ListBox 组成。

第一个 ListBox 是 Mart 分店的集合,第二个 ListBox 是一个 Mart 销售的水果、肉类、蔬菜等商品的集合。 第三个 ListBox 是一种 Mart 商品。 (apple, peach, peer, melon...) 4th ListBox 是一种选中的水果的聚合,例如,如果选中Apple,cortland,crabapple,sansa,gala 等等。

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

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

1'st, 2'nd, 4'th ListBox 很好,但是 3'rd ListBox 有错误。我认为 2'nd 和 3'rd 具有相同的结构。

第 3 个列表框无法更新选定项更改。不管SelectionMode(Single、Multiple、Extend),第3个ListBox的SelectedItems都有所有item 我已经选择了。此外,第 3 个 ListBox.SelectedItems 包含重复项。

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

目前,为了实现这个功能,我使用了迂回的方式。触发 SelectionChanged 后,我捕获了 SelctionChangedEventArgs 的 AdditionalItems。 所以,我使用 AdditionalItems 而不是 SelectdItem,例如 SelectionMode = "Single"

我尝试了很多建议,VirtualizingStackPanel.IsVirtualizing="False", IsSynchronizedWithCurrentItem="True",但我找不到解决方案。 很抱歉,我不能提供所有的落后代码和 ~ 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
    }

【问题讨论】:

  • 我认为您的问题是您的数据没有得到更新..而且您正在将 ListBoxes 的 itemsSource 设置为某个列表..所以您的解决方案可能是什么..当您重新设置 itemsSource更改选定项目或选定项目..并将您的列表设为可观察集合..我认为它可以帮助您...对于下面的任何查询更新..
  • 如果我对您的理解正确,这是 Sceranio 阅读的有关 IsSynchronizedWithCurrentItem="True" 的主要详细信息
  • 我的 ListBox 的 ItemsSource 是 ObservableCollection,如上所示。 “ItemList”是 ObservableCollection。所有的操作都很好。只是“lbLoadedItems.SelectedItems”没有更新。我选择的所有项目都在“lbLoadedItems”中累积,我会考虑更多您的推荐。感谢您的关注。
  • 我选择的所有项目都累积在 "lbLoadedItems" 中:我重写了 "lbLoadedItems ==> lbLoadedItems.SelectedItems" 我遇到的问题只是没有更新 ListBox 的 SelectedItems 属性。

标签: c# wpf xaml listbox


【解决方案1】:

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

代替:

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

这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2015-07-01
    相关资源
    最近更新 更多