如何使用自定义ItemsSource刷新ListBox的最简单方法?

7

我正在使用具有自定义ItemsSource的ListBox:

this.ListOfPersonsListBox.ItemsSource = (List<Person>)ListOfPersons.AllPersons;

ListOfPersons是一个静态类,因此它无法实现INotifyPropertyChanged或IObservableCollection。

更新列表后重新绘制ListBox的最简单方法是什么?我的当前代码可以工作,但我想找到更清晰的解决方案:

    private void SyncButton_Click(object sender, EventArgs e)
    {
        ListOfPersons.Sync();
        this.ListOfPersonsListBox.ItemsSource = null;
        this.ListOfPersonsListBox.ItemsSource = ListOfPersons.AllPersons;
    }

你能解释一下为什么ListOfPersons需要成为一个静态类吗?如果只是为了在多个页面之间方便访问,考虑将其作为应用程序范围的属性。然后你可以像keyboardP提到的那样使用ObservableCollection。 - Josh Earl
@JoshEarl,您能否解释一下“应用程序范围属性”的含义?我是初学者,从未听说过这样的东西... - Shaeak Silentread
2个回答

8
考虑使用 ObservableCollection 替代 List。它在内部实现了 INotifyPropertyChanged。您可以遍历列表并将每个元素添加到新的 ObservableCollection 对象中,然后将其绑定到 ListBox
如果您要经常进行转换,可以创建一个 Extension method
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> myList)
{
    var oc = new ObservableCollection<T>();
    foreach (var item in myList)
        oc.Add(item);
    return oc;
}

你可以直接从列表创建一个 ObservableCollectionvar oc = new ObservableCollection<Person>(ListOfPersons.AllPersons); - ChrisF
2
@ChrisF - ењЁSilverlight on WP7дё­жІЎжњ‰ObservableCollection<T>(List<T>)зљ„й‡ЌиЅЅгЂ‚еЏЇиѓЅењЁMangoдё­еЏЇз”ЁпјЊе› дёєе®ѓиїђиЎЊSL4гЂ‚ - keyboardP

1

Shaeak,

Application类在应用程序生命周期内存在。如果您有需要在应用程序的整个生命周期中从多个页面访问的内容,则可以创建一个继承自Application的部分类,并在此部分类上创建一个属性。

本文在页面下方三分之二处有解释。


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