WPF ListBox 未使用 ItemsSource 更新

Posted

技术标签:

【中文标题】WPF ListBox 未使用 ItemsSource 更新【英文标题】:WPF ListBox not updating with the ItemsSource 【发布时间】:2010-11-03 11:33:02 【问题描述】:

我认为在 WPF 设置中应该是简单的双向数据绑定,但列表框(目标)没有随着集合的变化而更新。

我正在以编程方式设置 ListBox 的 ItemsSource:

lstVariable_Selected.ItemsSource = m_VariableList;

ListBox声明如下:

<ListBox Margin="5" Name="lstVariable_Selected">
    <ListBox.ItemsPanel>
       <ItemsPanelTemplate>
          <VirtualizingStackPanel Orientation="Horizontal"/>
       </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
       <DataTemplate>
            <Border BorderBrush="Gray" BorderThickness="1" Margin="0">
                <TextBlock FontSize="25" Text="Binding Path=Name" />
            </Border>
       </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

当我最初设置 ItemsSource 时,ListBox(当时不可见)设置了它的项目。但是,如果我查看 ListBox,更新似乎会停止。

然后我可以从 m_VariableList 集合中删除一个项目,并且它不会从 ListBox 中消失。同样,如果我添加一个,它不会出现。

什么给了?

【问题讨论】:

请贴出用于将 ItemSource 绑定到 m_VariableList 的代码。 【参考方案1】:

您的 m_VariableList 是否实现了INotifyCollectionChanged?如果它不是 ObservableCollection,那么对其内容的更改将不会自动反映在 UI 中。

【讨论】:

它是一个 BindingList,根据 Rocky (forums.lhotka.net/forums/thread/17402.aspx) 的说法,它适用于 WPF 和 WinForms,而 INotifyCollectionChanged 仅适用于 WPF。 如果它实现了 IBindingList 那么它的工作原理是一样的。从你所描述的情况来看,还有其他一些事情并不明显,因为它会起作用。 原来底层实现已经改变(我不知道),当我认为它不再实现 IBindingList 时。道德:检查你(我的)假设。【参考方案2】:

问题不在于您提供的 XAML。我在测试应用程序中成功使用了相同的 XAML;但是,我能够通过重新实例化 m_VariableList 变量来复制您遇到的问题。

当 m_VariableList 被赋予一个新实例或指向一个新对象时,它不会反映在 ListBox 中,因为控件有自己对数据的引用。这可能不是您的问题的原因,但我建议您查看您的代码隐藏以确保该变量不会被重新实例化。

【讨论】:

谢谢,托尼。当我发现基类已更改时,我开始探索并试图找出集合可能在哪里被重新实例化。【参考方案3】:

我被困了一个多小时,然后简单的逻辑解决了这个问题 只需将 itemsource 设置为清除列表,然后再设置您需要的源

lstVariable_Selected.ItemsSource = new List<Object>();
lstVariable_Selected.ItemsSource = m_VariableList;

【讨论】:

这是一个肮脏的解决方法,不是一个好的解决方案。

以上是关于WPF ListBox 未使用 ItemsSource 更新的主要内容,如果未能解决你的问题,请参考以下文章

WPF ListBox 中使用网格布局

WPF:如何在调整大小后保持 ListBox SelectedItem 可见?

使用 gon-wpf 的 ListBox 拖放 - 使选择保持活动状态

创建一个显示所有预定义WPF颜色的ListBox

WPF ListBox WPF XAML 内的顶部对齐

在 WPF 中刷新 ListBox 的简单方法?