Данные сетки UWP не отображаются в автообновлении - PullRequest
0 голосов
/ 07 ноября 2019

Я новичок в разработке настольных приложений UWP. Сетка не может отображать данные на этапе автоматического обновления.

Я пытаюсь создать страницу с сеткой, которая будет извлекать данные из базы данных. Когда страница загружена, я запускаю таймер и обновляю сетку каждые 10 секунд. Результат хороший, когда страница содержит только сетку. Но если я добавлю панель команд сверху, сетка не сможет отображать данные при первом обновлении. Данные могут отображаться в первый раз, когда страница загружена. Кто-нибудь может посоветовать, какую часть я сделал неправильно?

код позади:

public sealed partial class DataGridPage : Page
{
    public string Titletext="";
    public DataGridViewModel ViewModel { get; } = new DataGridViewModel();

    DispatcherTimer dispatcherTimer;
    DateTimeOffset startTime;
    DateTimeOffset lastTime;
    DateTimeOffset stopTime;
    int timesTicked = 1;
    int timesToTick = 10;

    // TODO WTS: Change the grid as appropriate to your app, adjust the column definitions on DataGridPage.xaml.
    // For more details see the documentation at https://docs.microsoft.com/windows/communitytoolkit/controls/datagrid
    public DataGridPage()
    {
        InitializeComponent();
    }

    private void Page_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {
        DispatcherTimerSetup();
    }

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        await ViewModel.LoadDataAsync();
        //if (Titletext != "")
        //{
        //    GridTitle.Text = Titletext;
        //}
    }

    public void DispatcherTimerSetup()
    {
        dispatcherTimer = new DispatcherTimer();
        dispatcherTimer.Tick += dispatcherTimer_Tick;
        dispatcherTimer.Interval = new TimeSpan(0, 0, 10);
        //IsEnabled defaults to false
        //FormattingCommandBar.Content += "dispatcherTimer.IsEnabled = " + dispatcherTimer.IsEnabled + "\n";
        startTime = DateTimeOffset.Now;
        lastTime = startTime;
        //FormattingCommandBar.Content = "Calling dispatcherTimer.Start()";
        dispatcherTimer.Start();
        //IsEnabled should now be true after calling start
        //GridTitle.Text += "dispatcherTimer.IsEnabled = " + dispatcherTimer.IsEnabled + "\n";
    }

    async void dispatcherTimer_Tick(object sender, object e)
    {
        DateTimeOffset time = DateTimeOffset.Now;
        TimeSpan span = time - lastTime;
        lastTime = time;
        await ViewModel.LoadDataAsync();
        //Time since last tick should be very very close to Interval
        //FormattingCommandBar.Content = "Running dispatcherTimer: " + ViewModel.Source.Count;
        timesTicked++;
        if (timesTicked > timesToTick)
        {
            stopTime = time;
            //FormattingCommandBar.Content = "Calling dispatcherTimer.Stop()\n";
            dispatcherTimer.Stop();
            //IsEnabled should now be false after calling stop
            //GridTitle.Text += "dispatcherTimer.IsEnabled = " + dispatcherTimer.IsEnabled + "\n";
            span = stopTime - startTime;
            //GridTitle.Text += "Total Time Start-Stop: " + span.ToString() + "\n";
        }
    }
}

xaml (данные могут отображаться при автообновлении)

<Page.Content>
        <Grid x:Name="ContentArea">
            <Grid>
                    <controls:DataGrid
                    AutoGenerateColumns="False"
                    GridLinesVisibility="Horizontal"
                    ItemsSource="{x:Bind Mode=OneWay, Path=ViewModel.Source}" >
                        <controls:DataGrid.Columns>
                            <controls:DataGridTextColumn Binding="{Binding PaymentNo}" Header="Payment No." />
                            <controls:DataGridTextColumn Binding="{Binding PaymentDate}" Header="Payment Date" />
                            <controls:DataGridTextColumn Binding="{Binding Dept}" Header="Department" />
                            <controls:DataGridTextColumn Binding="{Binding PAYCD}" Header="Payee Code" />
                            <controls:DataGridTextColumn Binding="{Binding Vendor.companyName}" Header="Payee Name" />
                            <controls:DataGridTextColumn Binding="{Binding FC}" Header="F.C." />
                            <controls:DataGridTextColumn Binding="{Binding Amount}" Header="Amount"  />
                            <controls:DataGridTextColumn Binding="{Binding CountryID}" Header="Country ID" />
                        </controls:DataGrid.Columns>
                    </controls:DataGrid>

            </Grid>
        </Grid>
</Page.Content>

xaml (если stackpanelдобавлено, данные не могут отображаться при автообновлении)

<Page.Content>
    <StackPanel>
        <Button x:Name="ABC" Content="Options" Click="ABC_Click" ></Button>
        <Grid x:Name="ContentArea">
            <Grid>
                    <controls:DataGrid
                    AutoGenerateColumns="False"
                    GridLinesVisibility="Horizontal"
                    ItemsSource="{x:Bind Mode=OneWay, Path=ViewModel.Source}" >
                        <controls:DataGrid.Columns>
                            <controls:DataGridTextColumn Binding="{Binding PaymentNo}" Header="Payment No." />
                            <controls:DataGridTextColumn Binding="{Binding PaymentDate}" Header="Payment Date" />
                            <controls:DataGridTextColumn Binding="{Binding Dept}" Header="Department" />
                            <controls:DataGridTextColumn Binding="{Binding PAYCD}" Header="Payee Code" />
                            <controls:DataGridTextColumn Binding="{Binding Vendor.companyName}" Header="Payee Name" />
                            <controls:DataGridTextColumn Binding="{Binding FC}" Header="F.C." />
                            <controls:DataGridTextColumn Binding="{Binding Amount}" Header="Amount"  />
                            <controls:DataGridTextColumn Binding="{Binding CountryID}" Header="Country ID" />
                        </controls:DataGrid.Columns>
                    </controls:DataGrid>

            </Grid>
        </Grid>
    </StackPanel>
</Page.Content>

1 Ответ

0 голосов
/ 07 ноября 2019

StackPanel в терминах не поддерживает Виртуализация данных . Что означает, что обработка большого количества данных - беспорядок. Grid поддерживает виртуализацию данных по умолчанию, поэтому она обновляет.

Вы можете перейти с Grid. Если вы все еще хотите StackPanel Попробуйте VirtualizingStackPanel

, если я хочу иметь панель команд поверх сетки, каков наилучший способ сделать это

Вы могли бы сделать что-то вроде этого

<Page.Content>
<Grid>
  <Grid.RowDefinitions>
      <RowDefinition Height="Auto"></RowDefinition>
      <RowDefinition Height="*"></RowDefinition>
  </Grid.RowDefinitions>
    <Button x:Name="ABC" Content="Options" Click="ABC_Click" ></Button>
    <Grid x:Name="ContentArea" Grid.Row="1">
    ...
    </Grid>
</Grid>
</Page.Content>
...