【问题标题】:Datagrid binding asynchronous wpfDatagrid绑定异步wpf
【发布时间】:2018-10-04 10:03:05
【问题描述】:

每个人。我正在使用 WPF 并尝试异步填充数据网格,因此它不会锁定 UI。 我正在以异步方式从 DB 加载数据,但是如果我有很多记录,那么 UI 会被锁定,直到它完成填充 Datagrid。我几乎尝试了所有方法,但没有任何效果。

这是我的 xaml 代码:

<DataGrid x:Name="dgOrgAtts" HorizontalAlignment="Left" Height="400" Margin="195,172,0,0" VerticalAlignment="Top" Width="419" RenderTransformOrigin="0.051,-0.272" CanUserReorderColumns="False" CanUserResizeRows="False" IsEnabled="False" AutoGenerateColumns="False" EnableColumnVirtualization="False" EnableRowVirtualization="False" CanUserSortColumns="False">
                <DataGrid.Columns>
                    <DataGridCheckBoxColumn Binding="{Binding Mode=OneWay}" CanUserResize="False" Width="30" >
                        <DataGridCheckBoxColumn.HeaderTemplate>
                            <DataTemplate>
                                <CheckBox Checked="all_Checked" Unchecked="all_Unchecked" HorizontalAlignment="Center"/>
                            </DataTemplate>
                        </DataGridCheckBoxColumn.HeaderTemplate>
                        <DataGridCheckBoxColumn.ElementStyle>
                            <Style TargetType="{x:Type CheckBox}">
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                            </Style>
                        </DataGridCheckBoxColumn.ElementStyle>
                        <DataGridCheckBoxColumn.CellStyle>
                            <Style>
                                <EventSetter Handler="OrgAtt_Checked" Event="ToggleButton.Checked"/>
                                <EventSetter Handler="OrgAtt_Unchecked" Event="ToggleButton.Unchecked"/>
                            </Style>
                        </DataGridCheckBoxColumn.CellStyle>
                    </DataGridCheckBoxColumn>

                    <DataGridTextColumn Binding="{Binding AttName, Mode=OneWay, IsAsync=True}" ClipboardContentBinding="{x:Null}" Header="סוג קבוצת שיוך" CanUserSort="False" CanUserReorder="False" Width="Auto"/>
                    <DataGridTextColumn Binding="{Binding AttText, Mode=OneWay, IsAsync=True}" ClipboardContentBinding="{x:Null}" Header="שם קבוצת שיוך" CanUserSort="False" CanUserReorder="False" Width="Auto"/>
                    <DataGridTextColumn Binding="{Binding OrgAttId, Mode=OneWay,  IsAsync=True}" ClipboardContentBinding="{x:Null}" Header="מספר" Width="*"/>
                </DataGrid.Columns>
            </DataGrid>

这就是我将列表绑定到数据网格的方式:

Binding binding = new Binding();
                binding.Source = orgAtt;
                binding.IsAsync = true;
                dgOrgAtts.SetBinding(DataGrid.ItemsSourceProperty, binding);

它可以工作,但锁定 UI。 我想得到你的帮助。

【问题讨论】:

  • 你告诉我们你已经尝试了很多东西。你可以说得更详细点吗?您究竟尝试过什么?
  • 不要禁用行虚拟化。这导致 DataGrid 创建 很多 行 - 这很慢
  • @ASh 谢谢!现在从 40 秒缩短到 1 秒!

标签: c# wpf asynchronous datagrid


【解决方案1】:

我想唯一的选择是必须将异步任务中的每个项目一个一个地写入您的数据集合中(必须是可观察的)。如果您尝试一次渲染(因为据我的经验,问题在于渲染,而不是分配)大量数据会导致 UI 冻结。

【讨论】:

    【解决方案2】:

    试试这个:

            var token = new CancellationTokenSource();
            _tokens.Add(token);
            await Task.Run(() =>
            {
                foreach (var item in list)
                {
                    if (token.Token.IsCancellationRequested)
                        break;
                    Dispatcher.Invoke(() => Collection.Add(item));
                    RaisePropertyChanged("Collection");
                    Thread.Sleep(10);
                }
    
                if (token.Token.IsCancellationRequested)
                    Dispatcher.Invoke(() =>
                    {
                        foreach (var item in list)
                            Collection.Remove(item);
                        RaisePropertyChanged("Collection");
                    });
    
                _tokens.Remove(token);
            }, token.Token);
    

    使用 MVVM 工作正常 :)

    【讨论】:

      【解决方案3】:

      您要在网格中显示多少数据行,这会给系统带来如此大的负载?

      更好的方法是将数据加载与 UI 分开。展示。将 DataGrid 的 ItemSource 绑定到项的 ObservableCollection。使用直接数据库访问或某种 ORM 以异步方式从数据库中获取数据,然后将这些项目添加到 observable 集合中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-02
        • 1970-01-01
        • 2014-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-01
        • 2011-12-17
        相关资源
        最近更新 更多