【问题标题】:Simplest way to refresh ListBox with custom ItemsSource?使用自定义 ItemsSource 刷新 ListBox 的最简单方法?
【发布时间】:2011-06-07 15:26:38
【问题描述】:

我正在使用带有自定义 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 需要是一个静态类吗?如果只是为了方便在多个页面之间访问,请考虑将其设为应用程序范围的属性。然后你可以使用 ObservableCollection 作为keyboardP 提到的。
  • @JoshEarl 你能解释一下“应用程序范围的属性”是什么意思吗?我是初学者,从来没有听说过这样的事情......

标签: c# silverlight xaml windows-phone-7


【解决方案1】:

考虑使用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&lt;Person&gt;(ListOfPersons.AllPersons);
  • @ChrisF - 在 WP7 上的 Silverlight 中 ObservableCollection&lt;T&gt;(List&lt;T&gt;) 没有过载。可能在 Mango 中可用,因为它运行 SL4。
【解决方案2】:

谢克,

Application 类在应用生命周期内存在。如果您需要在应用程序的整个生命周期中从多个页面访问某些内容,一种解决方案是创建一个继承自 Application 的分部类,并在该分部类上创建一个属性。

This article 在页面下方大约三分之二处有解释。

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 2015-02-07
    • 2011-01-11
    • 1970-01-01
    • 2010-11-03
    • 2011-03-22
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多