如何在WPF中异步更新视图模型?

因此,我有一个WPF应用程序,该应用程序从MainWindow.xaml启动,然后启动一个后台线程,该线程在MainWindow的页面之间循环。线程真正做的是每20/30秒将内容设置到一个新页面(如果还有更好的方法可以做到这一点,那么我很乐意提出建议)。因此,我已经使用MVVM模式构建了应用程序,因此每个页面都有其自己的viewmodel类以及相应的数据。每个类都是一些包含要在Datagrid表中显示的数据的列表,并且该表已绑定到该列表。但是我想在不冻结UI的情况下更新列表,本质上是异步或在另一个线程上。我该怎么做?

到目前为止,我还没有真正提出任何解决方案,我考虑过在更新视图模型时将其锁定,但是我认为这样做会以某种方式破坏UI。

视图模型示例

private List<ChangeInfo> nonApprovedChanges;

public ÄrendenStatsViewModel()
{
    nonApprovedChanges = new List<ChangeInfo>;
}

public List<ChangeInfo> NonApprovedChanges //this is bound to a datagrid
{
    get { return nonApprovedChanges; }
    set
    {
        if (nonApprovedChanges != value)
        {
            nonApprovedChanges = value;
            OnPropertyChange();
        }
    }
}

更改幻灯片的主题

private void ManageSlides()
{
    new Thread(() =>
    {
        var page1 = new ExamplePage();
        var page2 = new ExamplePage2();

        while (true)
        {
            Dispatcher.Invoke(new action(() =>
            {
                Content = page1;
            }));
            Thread.Sleep(1000 * 20);
            Dispatcher.Invoke(new action(() =>
            {
                Content = page2;
            }
            Thread.Sleep(1000 * 30);
        }
    }).Start();
}

XAML

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Width="*" />
        <RowDefinition Width="15*" />
    </Grid.RowDefinitions>

    <Grid Grid.Row="0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="3*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <TextBlock Style="{StaticResource DataGridTitleStyle}" Grid.Column="0" HorizontalAlignment="Left" Text="Not approved" />
        <TextBlock Style="{StaticResource DataGridTitleStyle}" Grid.Column="1" HorizontalAlignment="Right" Text="{Binding NonApprovedChangesCount}" />
    </Grid>

    <DataGrid x:Name="nonApprovedChangesDataGrid" ItemsSource="{Binding NonApprovedChanges}" Style="{StaticResource DataGridStyle}" />
        <DataGrid.Columns>
            <DataGridTextColumn Width="3*" HeaderStyle="{StaticResource DataGridHeaderStyle}" Header="Change" Binding="{Binding Changenumber}" />
            <DataGridTextColumn Width="4*" HeaderStyle="{StaticResource DataGridHeaderStyle}" Header="Requester" Binding="{Binding Requester}" />
            <DataGridTextColumn Width="6*" HeaderStyle="{StaticResource DataGridHeaderStyle}" Header="Date" Binding="{Binding Date}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

我想要一个单独的线程(类似于页面滑块),该线程在示例视图模型中不断更新列表 nonApprovedChanges 。尽管它不必是一个单独的线程,但我只希望有一种利基的方式来更新列表,而不冻结UI。

liuyang0120 回答:如何在WPF中异步更新视图模型?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3125191.html

大家都在问