【问题标题】:What are the differences between using ItemsSource and foreach loop to assign data in a ListView?使用 ItemsSource 和 foreach 循环在 ListView 中分配数据有什么区别?
【发布时间】:2011-04-11 11:28:06
【问题描述】:

下面的代码sn-ps有什么区别吗?
我正在使用 VS 2010、.NET 4、WPF

代码片段 1:

List listEPutAway = new List(); // 这里在 listEPutAway 中分配一些数据 lvPutWaySearch.ItemsSource = listEPutAway; // lvPutWaySearch 是一个 ListView

代码片段 2:

List listEPutAway = new List(); // 这里在 listEPutAway 中分配一些数据 foreach(listEPutAway 中的 var ePutAway) { lvPutWaySearch.Items.Add(ePutAway); // lvPutWaySearch 是一个 ListView }

【问题讨论】:

    标签: wpf visual-studio-2010 listview


    【解决方案1】:

    有一个非常大的区别

    在第一个场景中,你是binding to the listEPutAway collection。这意味着如果集合实现了INotifyCollectionChanged,对它的任何更改都会自动反映在绑定到它的控件中。

    当然,在这个具体的例子中,List(究竟是哪个类?)可能没有实现这个接口。通常在绑定时,出于这个特定原因,您选择绑定到 ObservableCollection<T>

    在第二种情况下,您手动将项目列表提供给控件。然后,控件中的数据完全独立于您的应用程序中可能发生的任何其他事情。

    WPF 的主要吸引力之一是专门支持数据绑定,因此“WPF 方式”是第一个场景(并且也在 XAML 中声明绑定)。

    作为旁注,您应该记住,不能同时使用Items(手动填充)和ItemsSource(数据绑定)。

    【讨论】:

    • 我没有使用INotifyCollectionChanged。我想在单击按钮时生成一个 ListView。当我第一次单击按钮时它工作正常(对于代码片段 1 和 2)但是当我第二次单击按钮时,如果我在按钮的 Click 事件中使用代码片段 2,则会出现“NullReferenceException”异常。从这个角度看有什么区别。
    • @DavidWebb:除非您提供更多信息(确切地说,null 是哪个值?),否则无法确定。作为一般说明:所有 场景,包括您的场景,都可以构建为使用数据绑定而不是直接的过程代码。这只是习惯它的问题。我会知道,因为当我第一次接触 WPF 时,我也遇到了同样的情况。
    • 可能您建议使用 MVVM 模式。如果有人使用 WPF,我认为这是最好的建议。我的问题解决了。
    • 使用数据绑定的另一个好处是您可以利用 ListView 中的 VirtualizingStackPanel 的强大功能。这意味着如果您有 10,000 个项目,则仅绘制可见的项目。
    猜你喜欢
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2014-10-09
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多