在wpf中,我在 ViewModel
类中有一个 DataGrid
绑定到 DataView
。这是一个触摸面板嵌入式项目,因此每次我触摸并滑到面板上的手指时,它一直向我发送值并将这些值保存到DataTable
并将其分配给绑定的DataView
,以仅显示5或10随着数据的更新,行(预定义(。每次获得新行时,我都会删除最后一个,直到总DataTable
行计数为5/10。
这里的问题是,DataGrid
绑定到最后一个值的时间比平常更长。当我将手抬起面板时,我希望电网与这些值结合,但是要进行大约6到10秒钟的时间才能进行此操作,在此操作中,用户必须等待它完成。
为此,我使用了XAML
中的IsAsync
属性。正如预期的那样,这使得DataGrid
绑定快速,但每次数据更新时,DataGrid
闪烁。如何克服DataGrid
中的闪烁问题?还是有其他方法可以做到。我们正在遵循绑定的MVVM模式。
xaml:
<DataGrid
ItemsSource="{Binding Path=View, IsAsync=True, UpdateSourceTrigger=PropertyChanged}"
CanUserSortColumns="False"
CanUserResizeRows="False"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden"
EnableColumnVirtualization="True"
EnableRowVirtualization="True"
CanUserAddRows="False">
</DataGrid>
查看模型:
private void InsertCollection(List<string> values)
{
if (values == null || !values.Any()) return;
try
{
var dataRow = ObjectMessageDataTable.NewRow();
int columnCount = ObjectMessageDataTable.Columns.Count;
var inputs = values.Select(y => y as object).ToArray();
for (var i = 0; i < inputs.Count() && i < columnCount; i++)
dataRow[i] = values[i];
ObjectMessageDataTable.Rows.InsertAt(dataRow, 0);
var count = ObjectMessageDataTable.Rows.Count;
while (count > NumOfRows)
{
ObjectMessageDataTable.Rows.RemoveAt(NumOfRows);
count = ObjectMessageDataTable.Rows.Count;
}
ObjectMessageDataTable.AcceptChanges();
View = ObjectMessageDataTable.DefaultView;
}
catch (Exception ex)
{
}
}
我尝试了您的代码。直接数据限制数据限,并且闪烁将消失是如此简单:)。只需使用ObjectMessageAtaTable.defaultView而不是视图即可。因为以某种方式创建了视图对象本身,每次都会创建视图,这会从一开始就可以初始化数据。
ItemsSource="{Binding Path=ObjectMessageDataTable.DefaultView, IsAsync=True, UpdateSourceTrigger=PropertyChanged}"
所以更改为
<DataGrid
Grid.Row="1"
Width="Auto"
Height="Auto"
Margin="0,20,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Top"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
AlternatingRowBackground="WhiteSmoke"
AlternationCount="2"
AutoGenerateColumns="True"
BorderBrush="Black"
BorderThickness="1"
CanUserAddRows="False"
CanUserResizeRows="False"
CanUserSortColumns="False"
ColumnHeaderHeight="35"
EnableColumnVirtualization="True"
EnableRowVirtualization="True"
HorizontalScrollBarVisibility="Hidden"
ItemsSource="{Binding Path=ObjectMessageDataTable.DefaultView, IsAsync=True, UpdateSourceTrigger=PropertyChanged}"
RowHeight="30"
VerticalScrollBarVisibility="Hidden" />
希望它有帮助。