为什么在我工作的时候我的StatusBar没有更新?

时间:2011-10-25 12:54:11

标签: c# wpf binding mvvm statusbar

我想在我的应用程序中添加状态栏,但我无法弄清楚最佳解决方案是什么?我正在使用带有WPF的c#和模型MVVM。

现在我有一个部分有效的解决方案。问题是状态栏没有像我希望的那样经常更新。 当我向状态栏绑定的字符串写一个新值时,状态栏将更新太晚并且想要显示任何差异。

一个简单的例子(不是真正的代码):

StatusBar绑定到状态,并且initialy = Ready。

  1. status =正在下载

  2. 下载方法

  3. status = Ready

  4. 这导致没有视觉变化。当我调试代码时,状态值会更新,但状态栏中不会更改。

    你有任何吸烟吗?

    我的代码

    XAML查看:MainView.xaml

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

    MainViewModel的一部分

    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";        }
    

3 个答案:

答案 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提供“呼吸”的可能性。