因此,我有一个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。