WPF datagrid闪烁问题



在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" />

希望它有帮助。

最新更新