WPF ListBox不随ItemsSource更新

10

我认为我已经设置好了 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中消失。同样,如果我添加一个项目,它也不会出现。
怎么回事?

1
请发表您用于将ItemSource绑定到m_VariableList的代码。 - micahtan
3个回答

23

你的m_VariableList实现了INotifyCollectionChanged吗?如果它不是ObservableCollection,则对其内容所做的更改不会自动反映在UI中。


这是一个BindingList<T>,根据Rocky(http://forums.lhotka.net/forums/thread/17402.aspx)的说法,它适用于WPF和WinForms两种框架,而INotifyCollectionChanged仅适用于WPF。 - Paul Prewett
如果它实现了IBindingList接口,那么它将正常工作。从您所描述的内容中似乎还有其他问题,但这不会影响其正常工作。 - rmoore
结果发现底层实现已经改变(我不知道)并且它不再实现IBindingList,而我以为它仍然在实现。教训:检查你的(我的)假设。 - Paul Prewett

8
问题不在您提供的XAML中。我在测试应用程序中成功使用了相同的XAML;但是,通过重新实例化m_VariableList变量,我能够复制您遇到的问题。
当m_VariableList被给予一个新实例或指向一个新对象时,它不会反映在ListBox中,因为控件有自己对数据的引用。这可能不是您问题的原因,但我建议检查您的代码后台,确保变量没有被重新实例化。

谢谢,托尼。我去洞穴探险试图找出集合何时重新实例化时发现基类已更改。 - Paul Prewett

4
我卡了一个多小时,后来简单的逻辑解决了这个问题,只需要将itemsource设置为空列表,然后再设置所需的源。
lstVariable_Selected.ItemsSource = new List<Object>();
lstVariable_Selected.ItemsSource = m_VariableList;

1
这只是一个不太好的解决方案,而不是一个良好的解决方案。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接