2

我有一个包含 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 会重复使用项目容器,而不是每次都创建一个新容器。

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

4

1 回答 1

0

我认为您应该直接处理该行绑定的数据,而不是将数据拉出控件。这是有道理的,因为它是双向数据绑定,因此在您更改数据时会更新数据(假设它实现了 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 通常使用的一些技术,请查看这些视频教程。它是 VB.Net,但代码实际上并不是重点——它专注于 Silverlight 应用程序架构。我将从“SL4 和 WCF Ria 服务简介”开始,然后在 MVVM 上查看其中一个。

于 2012-11-27T02:43:02.343 回答