Я относительно новичок в 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 (находя их немного более простыми для понимания и отслеживания), поэтому мне пришлосьнемного проблем с их пониманием.
Может кто-нибудь пожалеть меня и указать мне правильное направление, или предложить дальнейшую отладку, которую я могу сделать?Спасибо!