当我修改了在列表框中绑定的项目的值时,我预计排序的顺序应该会自动更改。
但事实并非如此。
我是否调用.SortDescriptions.Clear()方法并在这种情况下重新分配SortDescription?
.Refresh()不起作用。
EDITED
我绑定并设置了这样的数据;
public Records myRecents;
....
//lbToday is a ListBox.
//ModifiedTime is a DateTime.
this.lbToday.ItemsSource = new ListCollectionView(myRecents);
this.lbToday.Items.SortDescriptions.Add(new SortDescription("ModifiedTime", ListSortDirection.Descending));
当应用程序第一次启动时,它显示正确的结果。但是当我修改item的值(在这种情况下,'ModifiedTime'属性)时,视图不会改变。我重新启动了应用程序,它再次显示了正确的结果。
EDITED2
以下是Records
。
public class Records : ObservableCollection<RecordItem>
{
public Records() { }
}
这是'RecordItem'的源代码
public class RecordItem : INotifyPropertyChanged
{
string queryString; public string QueryString { get { return queryString; } set { queryString = value; Notify("QueryString"); } }
DateTime modifiedTime; public DateTime ModifiedTime { get { return modifiedTime; } set { modifiedTime = value; Notify("ModifiedTime"); } }
public RecordItem() { }
public RecordItem(string qStr)
{
this.queryString = qStr;
this.modifiedTime = DateTime.Now;
}
public event PropertyChangedEventHandler PropertyChanged;
protected void Notify(string propName) { if (this.PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propName)); } }
}
注意
当我在myRecents中添加一个项目(Record类)时,它运行良好。仅修改属性时出现问题。
答案 0 :(得分:6)
看一下WPF博士的这篇文章:ItemsControl: 'E' is for Editable Collection
它可以帮助您解决问题。
答案 1 :(得分:1)
.NET 4.5向ListCollectionView添加了两个新属性,这是ListBox和CollectionViewSource.View的默认实现。
要对您的ModifiedTime
属性进行实时排序,请将其添加到LiveSortingProperties
并打开IsLiveSorting
。
list.SortDescriptions.Add(new SortDescription("ModifiedTime", ListSortDirection.Ascending));
list.IsLiveSorting = true;
list.LiveSortingProperties.Add("ModifiedTime");
当ModifiedTime
更改时,此列表应重新排序。这样做还有一个好处,就是不会刷新整个视图!