MVVM. Как уведомить свойство во ViewModel о изменении Model?
В своём приложении я ищу столкновения объектов...
- Есть TextBlock на View, в который записывается количество столкновений
- Я нажимаю кнопку на View
- Запускается метод в Model, который считает столкновения и в конце записывает их количество в переменную
- (проблема) Как уведомить TextBlock, о изменении переменной в Model?
UPD:
public class Model : INotifyPropertyChanged
{
// interface implementation
public static void Method()
{
// do something
Property++; // (ошибка)нужна ссылка на этот класс
}
private int property;
public int Property
{
get
{
return property;
}
set
{
property = value;
OnPropertyChanged();
}
}
}
Ответы (3 шт):
Всё просто: нужно переместить вычисления во ViewModel. Сама модель – это только данные. Все вычисления должны происходить в ViewModel.
Ну или вы должны сделать метод OnPropertyChanged private -> internal.
Как один из вариантов, можно использовать интерфейс IProgress<T>. Он предоставляет удобный, потокобезопасный способ отправлять промежуточные данные в процессе работы Model, например прогресс выполнения задачи. Тип передаваемых данных вы определяете сами. При этом колбэк, к которому привязан экземпляр класса Progress будет вызываться всегда в том потоке, в котором был создан, то есть, можно даже спокойно в колбэке модифицировать ObservableCollection.
В статичном классе
public static IProgress<int> Status { get; set; }
Использование
int report = 123;
Status?.Report(report);
Во ViewModel создайте колбэк для этого интерфейса с помощью класса Progress<T>, например в конструкторе VM.
StaticModelClass.Status = new Progress<int>(status => Property = status);
Ну а конечный резальтат работы статичного метода я бы просто использовал в возвращаемом значении в вызывающем методе.