MVVM. Как уведомить свойство во ViewModel о изменении Model?

В своём приложении я ищу столкновения объектов...

  1. Есть TextBlock на View, в который записывается количество столкновений
  2. Я нажимаю кнопку на View
  3. Запускается метод в Model, который считает столкновения и в конце записывает их количество в переменную
  4. (проблема) Как уведомить 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 шт):

Автор решения: return

Всё просто: нужно переместить вычисления во ViewModel. Сама модель – это только данные. Все вычисления должны происходить в ViewModel.


Ну или вы должны сделать метод OnPropertyChanged private -> internal.

→ Ссылка
Автор решения: aepot

Как один из вариантов, можно использовать интерфейс 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);

Ну а конечный резальтат работы статичного метода я бы просто использовал в возвращаемом значении в вызывающем методе.

→ Ссылка