Почему мой StatusBar не обновляется, пока я работаю? - PullRequest
1 голос
/ 25 октября 2011

Я хочу добавить строку состояния в свое приложение, но не могу понять, каким будет лучшее решение?Я использую c # с WPF и моделью MVVM.

Прямо сейчас у меня есть решение, которое частично работает.Проблема в том, что строка состояния обновляется не так часто, как хотелось бы.Когда я, например, записываю новое значение в строку, к которой привязана строка состояния, строка состояния обновляется слишком поздно и хочет показать любые различия.

Простой пример (не реальный код):

StatusBar привязан к состоянию и изначально = Готов.

  1. status = Загрузка

  2. метод загрузки

  3. статус = готов

Это не приводит к визуальным изменениям.Когда я отлаживаю код, значение статуса обновляется, но не изменяется в строке состояния.

У вас есть предложения?

Мой код

XAML View: 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 ]

4 голосов
/ 25 октября 2011

Вы ДОЛЖНЫ выполнять загрузку в фоновом потоке, самый простой способ - использовать компонент BackgroundWorker.В противном случае загрузка происходит в потоке пользовательского интерфейса, что означает перекачку и перерисовку сообщения о блокировке.Блокировка означает, что пользовательский интерфейс не обновляется, а хуже может означать, что Windows считает, что ваше приложение не отвечает.

Чтобы обновить коллекцию, связанную с потоком пользовательского интерфейса, вы должны иметь возможность использовать событие ReportProgress ипередать некоторые данные, которые обработчик может затем использовать для обновления OC.Обработчик ReportProgress будет перенесен в соответствующий поток пользовательского интерфейса.

2 голосов
/ 25 октября 2011

Используйте диспетчера из вашего Фонового потока (если вы запускаете обновление статуса в одном!).Вот хороший пост в блоге: Обновление пользовательского интерфейса из фоновой ветки

0 голосов
/ 25 октября 2011

Нельзя связать с Properties.Settings.Default. В том смысле, что если вы хотите, чтобы DataBinding работал, вам следует привязать к свойству класса, который реализует INotifyPropertyChanged , в вашем случае.

На той же связанной странице вы также увидите пример того, как это сделать.

Добавьте к этому также, как предположил Лаури, вызовы, не блокирующие пользовательский интерфейс, чтобы дать вашему интерфейсу возможность «дышать».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...