我有一个SDK:DATAGRID有20列左右,当它打开时它只显示四个字段/列。这就是我想要的以及我如何设计它
基本上我是根据用户点击获取信息 - 例子:
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重用项容器而不是创建 每次新的。
在初始加载时,如果单元格不可见,我无法抓住单元格 内容(除非它是第一个记录/行)。一次又一次的细胞/ 列可见,然后信息可用。
答案 0 :(得分: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一起使用的某些技术,请查看这些Video Tutorials。它是VB.Net,但代码实际上不是焦点 - 它专注于Silverlight应用程序架构。我将从“SL4和WCF Ria服务简介”开始,然后查看MVVM上的其中一个。