【问题标题】:Datagrid on demand load offDatagrid 按需卸载
【发布时间】:2012-11-14 14:10:48
【问题描述】:

我有一个包含 20 列左右的 SDK:DATAGRID,当它打开时只显示四个字段/列。这是我想要的以及我是如何设计的

基本上我是根据用户点击来获取信息 - 示例:

OWNERNAME.Text = ((TextBlock)EPICGrid.Columns[1].GetCellContent(EPICGrid.SelectedItem)).Text;

和/或

OWNERNAME2.Text = ((TextBlock)EPICGrid.Columns[16].GetCellContent(EPICGrid.SelectedItem)).Text;

我遇到的问题不会抓取单元格中的信息,除非我滚动并显示列,因此我只能抓取前 4 列数据,因为它们会在网格变得可见时显示。

我无法从第 5 -20 列中抓取数据,除非我滑过并使这些列可见。在单击期间它们不必可见......似乎在我查看该列之前数据并没有真正加载。

我想我应该说第一条记录/行加载所有数据/单元格/列,我可以从第一条记录中获取任何数据,但问题发生在记录 2 - *。

澄清一下 - 我的问题不是我的列或行的可见性。我的问题是 SDK DataGrid 似乎是按需加载数据。因此,如果该列有时不在视图中,则单元格中的信息不可用。

我不想显示所有列,也不想让用户能够查看所有列,所以我想禁用滚动条,但是当用户点击某一行时,我需要获取信息在某些单元格中,并且由于该列尚未加载,因此信息不存在。

如何关闭按需加载功能?

我进行了搜索,发现有人在加载行时遇到了类似的问题,建议设置VirtualizingStackPanel.VirtualizationMode = Standard

这几乎就像问题源于 VirtualizingStackPanel.VirtualizationMode 但我将此属性设置为标准并回收并且没有运气。

定义如下:

默认情况下,VirtualizingStackPanel 会为 每个可见项目并在不再需要时将其丢弃(例如 当项目滚动出视图时)。当 ItemsControl 包含 很多物品,创建和丢弃物品容器的过程 会对性能产生负面影响。什么时候 VirtualizingStackPanel.VirtualizationMode 设置为 Recycling,即 VirtualizingStackPanel 重用项目容器而不是创建一个 每次都有新的。

在初始加载时,如果单元格不可见,我无法抓取单元格 内容(除非它是第一条记录/行)。一次又一次的细胞/ 列可见,则信息可用。

【问题讨论】:

    标签: c# silverlight datagrid ondemand


    【解决方案1】:

    我认为您应该直接处理该行绑定的数据,而不是将数据拉出控件。这是有道理的,因为它是双向数据绑定,因此在您更改数据时会更新数据(假设它实现了 INotifyPropertyChanged 接口)。

    一个示例是数据网格绑定到 MyEntity 类型的集合。

         private void DataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (this.DataGrid1.SelectedItem == null)
                    return;
    
                MyEntity myEntity = (MyEntity)this.DataGrid1.SelectedItem;
    
                // at this point you have the (updated) data the row is bound to.
               MessageBox.Show("You Selected: " + myEntity.name);
               ...
    

    另一个例子是每一行都有一个按钮。单击按钮时要处理的代码如下所示:

          private void btnProcessEntity_Click(object sender, RoutedEventArgs e)
          {
    
             Button btn = sender as Button;
             MyEntity myEntity = btn.DataContext as MyEntity;
    
              // clicking a button in a row doesn't select the row, so select it.
             this.DataGrid1.SelectedItem = myEntity;  
             MessageBox.Show("Will Process: " + myEntity.name);
    
              ...
           }
    

    如果您不熟悉 Silverlight 通常使用的一些技术,请查看这些Video Tutorials。它是 VB.Net,但代码实际上并不是重点——它专注于 Silverlight 应用程序架构。我将从“SL4 和 WCF Ria 服务简介”开始,然后在 MVVM 上查看其中一个。

    【讨论】:

    • JBrooks,感谢您的帖子。我无法弄清楚 MyEntity 是什么...我需要声明它还是添加一个引用/程序集以便对其进行重新配置...对不起,我仍然是绿色的。
    • @DickLong MyEntity 只是我的示例,例如 MyTable、MyClass 等。在 Silverlight 中,实体集合通常是您通过 RIA 服务从实体框架获取数据网格后将其绑定到的对象。这 3 种技术在 Silverlight 应用程序中很常见。
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2018-02-11
    • 2015-01-20
    • 1970-01-01
    相关资源
    最近更新 更多