StatusBar не всегда обновляется - PullRequest
2 голосов
/ 13 июня 2011

Я относительно новичок в MVVM и пытаюсь написать базовую строку состояния для приложения MVFM WPF.Я думаю, что у меня есть суть вещей, но по какой-то причине строка состояния не всегда обновляется, и я не уверен почему.

В моей ViewModel у меня есть базовое свойство, которое я обновляю при изменениисообщение о состоянии:

public string StatusMessage
{
    get { return _statusMessage; }
    set
    {
        if (value == _statusMessage) return;
        _statusMessage = value;
        base.OnPropertyChanged(() => this.StatusMessage);
    }
}

Мой метод OnPropertyChanged (который у меня есть в базовом классе ViewModel, который реализует INotifyPropertyChanged) выглядит так (получил эту идею от Гюнтера Фойдля; хотел бы я претендовать на кредит, потому что я думаю,это гладко, но я не настолько умен):

protected virtual void OnPropertyChanged<T>(Expression<Func<T>> exp)
    {
    MemberExpression me = exp.Body as MemberExpression;
    string propName = me.Member.Name;

    PropertyChangedEventHandler handler = this.PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propName));
    }
}

В любом случае, все это прекрасно работает для всех моих элементов управления, кроме одного.В моем файле MainWindow.xaml у меня есть элемент управления StatusBarItem, связанный с вышеуказанным свойством, например, так (остальная часть XAML была обрезана из-за нехватки места):

<StatusBarItem Grid.Column="0">
    <TextBlock TextTrimming="CharacterEllipsis" Text="{Binding Path=StatusMessage}" />
</StatusBarItem>

Когда я запускаю свое приложение (котороебьет пару БД в дополнение к генерации документа из шаблона и кучу других довольно ресурсоемких вещей), некоторые, но не все, сообщения отображаются в строке состояния.Я отладил и проверил, что все сообщения попадают в свойство StatusMessage выше (и вытекающую из этого приватную переменную), они просто не обновляются в пользовательском интерфейсе.

Я рассмотрел несколько примеровкоторые используют экземпляры BackgroundWorker для элементов управления ProgressBar, но не видели ни одного для элементов управления StatusBarItem, и я не совсем уверен, как преобразовать одно в другое.

Я также использовал «Задачи» ранее в предыдущих C # 4.0 и приложениях WPF и считаю, что это, вероятно, хороший путь, но я так и не смог выяснить, как / где определить задачу пользовательского интерфейса (Раньше я всегда делал это в коде для MainWindow, но я стремлюсь к тому, чтобы код не работал, чтобы соответствовать MVVM здесь).

Я почти уверен, что многопоточный подход - это путь;Я просто недостаточно знаю об одном подходе (я знаю немного об этом и немного об этом), чтобы заставить его работать.Я видел пару постов, в которых непосредственно использовался более старый подход к многопоточности, но я в значительной степени держался подальше от многопоточного программирования, пока не начал использовать Задачи с .NET 4.0 (находя их немного более простыми для понимания и отслеживания), поэтому мне пришлосьнемного проблем с их пониманием.

Может кто-нибудь пожалеть меня и указать мне правильное направление, или предложить дальнейшую отладку, которую я могу сделать?Спасибо!

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

1) Связывание на основе отражений иногда может быть источником ошибки из-за встраивания. Попробуй посмотреть, что произойдет, если ты заменил свойствоproperty на простую строку вместо отражения.

2) если вы используете многопоточность, есть вероятность того, что вы установили StatusMessage не из UIThread, в этом случае он не сможет обновлять пользовательский интерфейс, вы можете вызвать установочный код в диспетчере пользовательского интерфейса, чтобы проверить, помогает ли это

3) проверьте, работает ли привязка, в конструкторе формы xaml измените StatusMessage непосредственно на ВМ и посмотрите, отображается ли изменение в пользовательском интерфейсе без вызова многопоточных вызовов служб, которые вводят дополнительные переменные в простой текстовый блок - привязка строк

4) если это не поможет, вы можете создать простую форму xaml с одним текстовым блоком, привязать ее к своей большой модели представления и посмотреть, что произойдет, если ничего не получится, вы можете начать вырезать класс VM, чтобы сделать его проще, поэтому привязка в конце концов начнет работай и найдешь ошибку

5) если вы считаете, что проблема в строке состояния, посмотрите, работает ли один текстовый блок без строки состояния (извлеките часть xaml из вашего примера)

2 голосов
/ 14 июня 2011

Где-то уведомление не проходит.

Я бы попробовал:

  • Добавьте фиктивный преобразователь значений в текстовую привязку, чтобы вы могли установить точку останова и посмотреть, если вас вызывают
  • Отправка свойства, установленного для установки значения в «лучшее» время - иногда это необходимо.

Отправка набора может помочь.

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