我想在我的应用程序中添加状态栏,但我无法弄清楚最佳解决方案是什么?我正在使用带有WPF的c#和模型MVVM。
现在我有一个部分有效的解决方案。问题是状态栏没有像我希望的那样经常更新。 当我向状态栏绑定的字符串写一个新值时,状态栏将更新太晚并且想要显示任何差异。
StatusBar绑定到状态,并且initialy = Ready。
status =正在下载
下载方法
status = Ready
这导致没有视觉变化。当我调试代码时,状态值会更新,但状态栏中不会更改。
你有任何吸烟吗?
<StatusBar DockPanel.Dock="Bottom" >
<StatusBar.ItemsPanel>
<ItemsPanelTemplate>
<Grid Margin="0 -5 0 0">
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
</Grid>
</ItemsPanelTemplate>
</StatusBar.ItemsPanel>
<StatusBarItem Grid.Column="0">
<TextBlock Name="statusBarStatus" Text="{Binding Status}"></TextBlock>
</StatusBarItem>
</StatusBar>
private void UpdateDepartmentsExecute()
{
Status = "Updating...";
repository.ShowAppDep = ShowAppDep;
repository.ShowInDep = ShowInDep;
repository.ShowSisDep = ShowSisDep;
repository.getPriority1 = SetPriorityTo1;
repository.getPriority2 = SetPriorityTo2;
repository.getPriority3 = SetPriorityTo3;
repository.getPriority4 = SetPriorityTo4;
repository.getPriority5 = SetPriorityTo5;
repository.UpdateTasksToShow();
repository.UpdateWorkareas();
repository.UpdateEmployees();
repository.UpdateTasksToShowByEmployee();
repository.UpdateWorkAreaByEmployee();
repository.GenerateStatistics();
TasksToShowCount = repository.TasksToShow.Count();
if (SelectedView == new Uri("pack://application:,,,/View/EstimateLoadView.xaml"))
{
MessageBox.Show("The Gantt Chart wan't show all relations when you are filtering the data. This might be a source to errors.", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
SelectedView = new Uri("pack://application:,,,/View/EntryView.xaml");
}
Status = "Ready"; }
答案 0 :(得分:4)
您必须在后台线程中进行下载,最简单的方法是使用BackgroundWorker组件。否则,您的下载将在UI线程中进行,这意味着您的阻止消息正在进行重新绘制。阻止这意味着您的UI不会更新,更糟糕的是,Windows可能意味着您的应用程序没有响应。
要更新绑定到UI线程的集合,您应该能够使用ReportProgress事件并传递一些数据,处理程序可以使用这些数据来更新OC。 ReportProgress处理程序将被封送到正确的UI线程。
答案 1 :(得分:2)
使用后台线程中的调度程序(假设您正在运行状态更新!)。这是一篇很好的博文:Updating UI from a background thread
答案 2 :(得分:0)
您无法绑定到Properties.Settings.Default
。在这种情况下,如果您希望DataBinding有效,则应该绑定到实现INotifyPropertyChanged的类的属性。
在同一个链接页面上,您还应该看到一个如何做到这一点的示例。
此外,就像Lauri建议的那样,非UI阻止调用,以便为您的UI提供“呼吸”的可能性。