WPF, C #, MVVM Динамически уведомлять ViewModel об изменениях статических переменных в Model - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть ViewModel , которая выполняет некоторые функции. Функции запускаются по кнопке, у меня есть команда по нажатию кнопки.

ViewModel.cs

class WindowViewModel : INotifyPropertyChanged
{
    public WindowViewModel()
    {
        canExecute = true;
    }

    public ICommand ApplyKMMCommand //command for button click, works great, tested
    {
        get
        {
            return applyKMMCommand ?? (applyKMMCommand = new Commands.CommandHandler(() => 
                                                       ApplyKMMToNewImage(), canExecute));
        }
    }

    private bool canExecute;
    private ICommand applyKMMCommand;

    public void ApplyKMMToNewImage()
    {
        ApplyKMM.Init(); //algorithm name
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public BitmapImage DisplayedImage //displaying image that i work with
    {
        get { return Bitmaps.Filepath; }
        set { Bitmaps.Filepath = value; NotifyPropertyChanged(nameof(DisplayedImage)); }
    }
}

Теперь мой ApplyKMM.Init()

class ApplyKMM
{

    public static void Init()
    {
        Bitmaps.Filepath = //do some thing with it...
    }
}

И мой Models.Bitmaps.cs

    static public BitmapImage Filepath
    {
        get { return filepath; }
        set { filepath = value; }
    }

    static private BitmapImage filepath{ get; set; }

Проблема в том, что, когда я задаю ApplyKMM.Init, элемент управления Image, который связан для просмотра, не меняет свое значение.

Без ApplyKMM я могу сделать во ViewModel эту вещь:

DisplayedImage = //do things with bitmap...

И затем, Image, который представлен в виде изменения (после создания объектов с этим изображением).

Можете ли вы сказать мне, как уведомить ViewModel, что где-то в коде filepath из Моделей изменилось?

EDIT:

Связывание в View Похоже на стандартное связывание:

<Image Source="{Binding DisplayedImage}"/>

Нажатие кнопки тоже работает, у меня проблема только со связью между Models->ApplyKMM->ViewModel

EDIT2:

Свойства Filepath - это хранилище в папке Models, а не папка, в которой находится функция ApplyKMM. Загляни в мою правку, я пытаюсь сделать что-то вроде:

Models -> ApplyKMM -> ViewModel. Из моделей я получаю Filepath. Затем я использую функцию ApplyKMM, которая находится в другом пространстве имен. Затем, после работы с растровым изображением с ApplyKMM func, я хочу как-то уведомить ViewModel, что работа над Model завершена (например, преобразовать в оттенки серого), и я хочу показать это изображение в градациях серого в VM. Это работает, когда я хочу сделать Model -> ViewModel (ApplyKMM в классе VM), но я хочу отойти ApplyKMM от ViewModel. И это, когда у меня начинается старое.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Похоже, что вы хотите уведомить, когда статическое свойство изменяется. Для этого вы можете использовать событие StaticPropertyChanged.

class ApplyKMM
{
    #region Properties
    static BitmapImage _Filepath;
    public static BitmapImage Filepath
    {
        get { return _Filepath; }
        set { if (_Filepath != value) { _Filepath = value; NotifyPropertyChanged(nameof(Filepath)); } }
    }
    #endregion

    #region Static NotifyPropertyChanged
    public static void NotifyStaticPropertyChanged(string propertyName)
    {
        StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
    }

    public void NotifyAllStaticPropertyChanged()
    {
        NotifyStaticPropertyChanged(string.Empty);
    }

    public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
    #endregion
}

Обратите внимание, что это доступно в WPF версии 4.5.
Вы также можете найти этот вопрос интересным.

0 голосов
/ 11 сентября 2018

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

Тогда давайте посмотрим на ваш код:

Bitmaps класс не реализует INotifyPropertyChanged, поэтому, когда Filepath изменяется, ничего не будет уведомлено (конечно, это статическое свойство)

В вашем случае вы должны использовать локальную переменную для хранения DisplayedImages.Затем изменения в DisplayedImage должны быть обновлены привязкой.

BitmapImage _displayedImage;
public BitmapImage DisplayedImage 
{
    get { return displayedImage; }
    set { displayedImage = value; NotifyPropertyChanged(nameof(DisplayedImage)); }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...