强制数据绑定WPF列表框更新的更好方法?

强制数据绑定WPF列表框更新的更好方法?,wpf,data-binding,listbox,observablecollection,Wpf,Data Binding,Listbox,Observablecollection,我有一个WPF列表框,它绑定到一个可观察的集合, 当集合更改时,所有项都会更新其位置 新位置存储在集合中,但UI不会更新。 因此,我添加了以下内容: void scenarioItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { ToolboxListItem.UpdatePositions();

我有一个WPF列表框,它绑定到一个可观察的集合, 当集合更改时,所有项都会更新其位置

新位置存储在集合中,但UI不会更新。 因此,我添加了以下内容:

    void scenarioItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        ToolboxListItem.UpdatePositions();
        lstScenario.ItemsSource = null;
        lstScenario.ItemsSource = ToolboxListItem.ScenarioItems;
        this.lstScenario.SelectedIndex = e.NewStartingIndex;
    }
通过将ItemsSource设置为null,然后再次绑定它,UI将更新

但这可能是非常糟糕的编码:p


建议?

我昨天也遇到了同样的问题,这完全是一堆废话:)。。。不过,我不会再将我的设置为空。在我的场景中,我将其设置为MyList.ToArray()(每次添加到列表后)


我看到了多个“哦,你需要使用ObservableList”我有一个列表框绑定到一个对象属性,该属性的类型为
List()
,我验证了以下代码在更新列表时会更新列表框

void On_MyObjProperty_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
   MyListBox.Items.Refresh();
}

如果您仍然面临问题,请扫描VS IDE输出窗口(Ctrl+W,O),查看是否可以发现报告的任何绑定错误。

如果您有一个对象的可观察列表,并且您正在更改这些对象内的属性,则通知不适用,因为集合没有直接更改。在更改对象属性后,我使用Insert()将更改后的对象重新添加到集合中,然后使用RemoveAt()删除旧副本,从而强制执行通知。它并不漂亮,但很有效。

WPF将项目列表/集合绑定到列表框,但在项目更新后,UI不会刷新,已解决

我只是愚蠢。虽然我读了很多关于使用
observateCollection
而不是
List
,但我还是忽略了这个建议,继续遵循其他建议,但毫无效果。回到我的书上,重读一遍。很好地解释了,
observedcollection
是必须使用的,因为
List
没有提供
INotifyCollectionChange
接口,当集合中的项目发生变化时,
ListBox
可以更新其显示

这是更新的代码:

private ObservableCollection<StringWrapper> m_AppLog;
ObservableCollection<StringWrapper> Log { get { return m_AppLog; } }
ObservableCollection
不支持未创建更新的线程进行更新。因为我的列表(显示最近错误/信息消息的可视日志)可以从不同的线程进行更新,所以我添加了以下内容来调整代码,以确保使用列表自己的调度程序完成更新:

public void AddToLog(string message) {
    if (Thread.CurrentThread != Dispatcher.Thread) {
        // Need for invoke if called from a different thread
        Dispatcher.Invoke(
            DispatcherPriority.Normal, (ThreadStart)delegate() { AddToLog(message); });
    }
    else {
        // add this line at the top of the log
        m_AppLog.Insert(0, new StringWrapper(message));
        // ...

还要注意的是,
observedcollection
不支持
RemoveRange()
列表
相反。这是从列表切换到ObservableCollection时可能需要进行的调整的一部分。

这是旧东西,但请使用ObservableCollection。如果希望UI看到ObservableCollection对象中属性的更新,则需要在该对象的类Defention中实现INotifyPropertyChanged。然后在每个属性的setter中引发属性更改事件

Public Class Session
Implements INotifyPropertyChanged

Public Event PropertyChanged As PropertyChangedEventHandler _
   Implements INotifyPropertyChanged.PropertyChanged

Private Sub NotifyPropertyChanged(ByVal info As String)
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub

Private _name As String = "No name"
''' <summary>
''' Name of Session
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property Name() As String
    Get
        Return _name
    End Get
    Set(ByVal value As String)
        _name = value
        NotifyPropertyChanged("Name")
    End Set
End Property
公开课
实现INotifyPropertyChanged
公共事件属性更改为PropertyChangedEventHandler_
实现INotifyPropertyChanged.PropertyChanged
私有子NotifyPropertyChanged(ByVal信息作为字符串)
RaiseEvent PropertyChanged(我,新PropertyChangedEventArgs(信息))
端接头
Private\u name As String=“无名称”
''' 
“会话名称”
''' 
''' 
''' 
''' 
作为字符串的公共属性名()
得到
返回\u名称
结束
设置(ByVal值作为字符串)
_名称=值
NotifyPropertyChanged(“名称”)
端集
端属性

我可能会遇到与您类似的问题,但我不确定

我有一个
可观察收集
和一个
列表框
绑定到它。但是由于某种奇怪的原因,当我更改列表中
MyEntity
对象的属性时,我的
ListBox
没有被更新

在搜索了一段时间后,我找到了以下页面,我只需让您知道:


它很好地描述了当列表或其中的对象发生变化时,要更新
列表框
,必须执行的操作。希望您能从中受益。

在我看来,它更像是ListBox和ListView中的一个bug。我绑定到一个ObservableCollection,集合中的项实现INotifyPropertyChanged。当我动态按下“添加项目”按钮时,UI不显示添加的项目,但是我有一个绑定到MyCollection.Count的计数器控件。每次按下“添加项目”按钮时,此计数器控件都会递增。如果调整视图的大小,列表框将显示我添加的所有项目。因此,ListBox控件上的ItemSource绑定被破坏。我还注意不要在任何时候创建新的MyCollection,这会破坏绑定。呜呜。

我知道它已经有点老了,但今天我面临着同样的问题。我更新了ObservableCollection中对象的一个属性,但视图没有更新,但后来我发现了一篇很棒的文章

我认为手动触发ObservableCollection的更新是一个非常干净的解决方案:

CollectionViewSource.GetDefaultView(this.myObservableCollection).Refresh();

相信我,我能理解你的沮丧,所以我不会冒犯你。我尝试过使用GetBindingExpression,但在null中返回:pmy“GetBindingExpression”不返回null。。。但是,即使我称之为“UpdateTarget”,它也不会起任何作用:(…仅在这种情况下…它对其他一切都很有效。这似乎解决了问题,因此我将把错误问题转移到另一篇文章中。谢谢!自从有人对此发表评论以来已经两年多了…非常感谢!如果列表框绑定到公共属性“MyItems”而具有tihs属性的类实现了INotifyPropertyChanged,为什么不直接引发事件PropertyChanged(这是“MyItems”)?它将通知用户界面此对象已更改,并自动更新其值。@JoanComasFdz此解决方案适用于我的情况。在我的情况下,列表框的ItemsSource被数据绑定到ObservableCollection。当BusinessObject.SomeProperty更改时,列表没有
CollectionViewSource.GetDefaultView(this.myObservableCollection).Refresh();