Как обновить отображение элемента представления при изменении значения свойства методом ВМ?

Нужна помощь. Привет всем. Я действительно понятия не имею, как обновлять элементы представления, когда значение свойства обновляется с помощью моего метода Egzecute внутри MsgViewModel, вызываемого с помощью public ICommand Start. Например, я хочу сделать одну кнопку STOP видимой, а другую - START - свернутой, когда свойство Status меняет свое значение с Stopped на Sending. Также обратите внимание, что видимость обновляется правильно, когда свойство Status изменяется с помощью конструктора ViewModels на (по умолчанию при запуске для меня) Status = Models.SendingStatus.Stopped; или Status = Models.SendingStatus.Sending;.

Вид:

<!--START, to be collapsed-->
<Button Grid.Row = "0"
                Grid.Column = "4"
                Background = "#80B584"
                Visibility = "{Binding RelativeSource = {RelativeSource Self}, Path=IsEnabled, Mode=OneWay,
            Converter = {StaticResource boolStart}}" Margin = "0,145,443.667,-0.333"
                Command = "{Binding Path=Start}">
            <TextBlock Text = "START" TextWrapping = "Wrap" TextAlignment = "Center"/>
        </Button>
        <!--STOP, to be viewed-->
        <Button Grid.Row = "0"
                Background = "#FF8A8A"
                Visibility = "{Binding RelativeSource = {RelativeSource Self}, Path=IsEnabled, Mode=OneWay,
            Converter = {StaticResource boolStop}}" Margin = "0,145,443.667,-0.333">
            <TextBlock Text = "STOP" TextWrapping = "Wrap" TextAlignment = "Center"/>
        </Button>

ViewModel:

private Models.MsgModel message= new Models.MsgModel (); //model instance
public MsgViewModel() //constructor, by default makes staus "Stopped"
        {
            Status = Models.SendingStatus.Stopped;
        }
public Models.SendingStatus Status
        {
            get
            {
                return message.Status;
            }
            set
            {
                message.Status = value;
            }
        }
private ICommand start;
        public ICommand Start //command called by START button, supposed to collapse it, and show STOP button
        {
            get
            {
                if (start == null)
                    start = new RelayCommand(
                    o =>
                    {
                        Egzecute();
                    });
                return start;
            }
        }
public void Egzecute() //method called by the command
        {
            Status = Models.SendingStatus.Sending;
            var openDialog = new Powiadomienie();
            openDialog.ShowPowiadomienie(Status.ToString(), "Powiadomienie"); //shows updated SendingStatus, but the View is not updating to it
        }

Модель:

public enum SendingStatus: byte { Sending, Waiting, Stopped} //enum for Status property
public class MsgModel : INotifyPropertyChanged
private SendingStatus status;
        public SendingStatus Status //Status model property
        {
            get
            {
                return status;
            }
            set
            {
                status = value;
                OnPropertyChanged("Status");
            }
        }
public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(params string[] propertyNames) 



        {
            if (PropertyChanged != null)
            {
                foreach (string propertyName in propertyNames) 
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

Конвертеры:

public class BooleanStart : IValueConverter //text decoration
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            ViewModels.MsgViewModel mvm = new ViewModels.MsgViewModel();
            bool bvalue = (bool)value;
            if (mvm.Status == Models.SendingStatus.Sending|| mvm.Status == Models.SendingStatus.Waiting)
            {
                return Visibility.Collapsed;
            }
            else
            {
                return Visibility.Visible;
            }
        }
        public object ConvertBack(object value, Type targetType, object parameter,
        CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    public class BooleanStop : IValueConverter //text decoration
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            ViewModels.MsgViewModel mvm = new ViewModels.MsgViewModel();
            bool bvalue = (bool)value;
            if (mvm.Status == Models.SendingStatus.Sending|| mvm.Status == Models.SendingStatus.Waiting)
            {
                return Visibility.Visible;
            }
            else
            {
                return Visibility.Collapsed;
            }
        }
        public object ConvertBack(object value, Type targetType, object parameter,
        CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

У меня вопрос, как обновить View после вызова метода по команде?

@Clemens Спасибо, обновлены идентификаторами en-us.

user8532173 14.05.2018 21:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, через несколько часов я понял свою ошибку. Конвертер был неправильным. Привязка должна быть другой, а ViewModel обновляется с уведомлением об изменении свойства. Конвертеры:

public class BooleanStart : IValueConverter //text decoration
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            Models.SendingStatus sendingStatus = (Models.SendingStatus)value;
            if (sendingStatus == Models.SendingStatus.Sending || sendingStatus == Models.SendingStatus.Waiting)
            {
                return Visibility.Collapsed;
            }
            else
            {
                return Visibility.Visible;
            }
        }
        public object ConvertBack(object value, Type targetType, object parameter,
        CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    public class BooleanStop : IValueConverter //text decoration
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            Models.SendingStatus sendingStatus = (Models.SendingStatus)value;
            if (sendingStatus == Models.SendingStatus.Sending || sendingStatus == Models.SendingStatus.Waiting)
            {
                return Visibility.Visible;
            }
            else
            {
                return Visibility.Collapsed;
            }
        }
        public object ConvertBack(object value, Type targetType, object parameter,
        CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Для переплета:

<!--START-->
        <Button Grid.Row = "0"
                Grid.Column = "4"
                Background = "#80B584"
                Visibility = "{Binding Path=Status, Converter = {StaticResource boolStart}}" Margin = "0,145,443.667,-0.333"
                Command = "{Binding Path=Start}">
            <TextBlock Text = "START" TextWrapping = "Wrap" TextAlignment = "Center"/>
        </Button>
        <!--STOP-->
        <Button Grid.Row = "0"
                Background = "#FF8A8A"
                Visibility = "{Binding Path=Status, Converter = {StaticResource boolStop}}" Margin = "0,145,443.667,-0.333"
                Command = "{Binding Path=Start}">
            <TextBlock Text = "STOP" TextWrapping = "Wrap" TextAlignment = "Center"/>
        </Button>

ViewModel` метод:

public void Egzecue()
        {
            Status = Models.SendingStatus.Sending;
            OnPropertyChanged("Status");
            var openDialog = new Powiadomienie();
            openDialog.ShowPowiadomienie(Status.ToString(), "Powiadomienie");
        }

Другие вопросы по теме