Связывание данных асинхронным wpf - PullRequest
0 голосов
/ 04 октября 2018

все.Я использую WPF и пытаюсь заполнить сетку данных асинхронно, чтобы он не блокировал пользовательский интерфейс.Я загружаю данные из БД асинхронным способом, но если у меня много записей, пользовательский интерфейс блокируется, пока он не завершит заполнение таблицы данных.Я перепробовал почти все, и ничего не работает.

это мой код 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);

работает, но блокирует пользовательский интерфейс.Я хотел бы получить вашу помощь.

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Попробуйте:

        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:)

0 голосов
/ 04 октября 2018

Сколько строк данных вы пытаетесь отобразить в сетке, которая создает такую ​​нагрузку на систему?

Лучшим способом было бы отделить загрузку данных от дисплея пользовательского интерфейса.Свяжите ItemSrid ItemGrid с ObservableCollection элементов.Получите данные из базы данных асинхронным способом, используя прямой доступ к базе данных или какой-либо ORM, а затем добавьте эти элементы в наблюдаемую коллекцию.

0 голосов
/ 04 октября 2018

Полагаю, единственный вариант - записывать каждый элемент по одному в асинхронной задаче в сбор данных (должен быть заметен).Если вы попытаетесь отобразить (поскольку, насколько я могу судить по опыту, проблема заключается в отображении, а не в назначении) большого количества данных одновременно, это приведет к зависанию пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...