Задать вопрос
oZ-Zo
@oZ-Zo
.Net энтузиаст

Как изменить внешний вид и состояние объекта из ViewModel?

Добрый день!
Осваиваю шаблон MVVM и столкнулся с такой проблемой: есть UserControl который содержит в себе 2-ва текстовых блока и переключатель. Переключатель это тоже UserControl, имеет 2-ва состояния (включен и выключен), выглядит более-менее похоже на переключатель в Windows 10. При нажатии на переключатель запускается анимация его переключения, и его текущее состояние сохраняется в приватной переменной. Для изменения состояния и внешнего вида переключателя используется событие MouseLeftButtonDown.
Вопрос: как используя шаблон MVVM изменить внешний вид и состояние переключателя из ViewModel? Мне нужно, что бы можно было менять внешний вид и состояние переключателя и кликая на нем и из ViewModel.
Спасибо.

Update: После того, как сформулировал и задал вопрос - стало понятно, как можно решить проблему. Метод утёнка работает. Для изменения внешнего вида или состояния объекта можно к DependencyProperty привязать метод.

Модель объекта Switch:
public class SwitchBarModel : INotifyPropertyChanged
    {
        private bool switchState = default(bool);

        public bool SwitchState
        {
            get => switchState;
            set
            {
                switchState = value;
                OnPropertyChanged("SwitchState");
            }
        }      

        public event PropertyChangedEventHandler PropertyChanged;

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


Code-behind UserControla Switch:
public bool State
        {
            get { return (bool)GetValue(StateProperty); }
            set { SetValue(StateProperty, value); }
        }

        // Using a DependencyProperty as the backing store for State.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty StateProperty =
            DependencyProperty.Register("State", typeof(bool), typeof(Switch), new PropertyMetadata(<b>OnStateChanged</b>));

        private static void <b>OnStateChanged</b>(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
          <b> // Первой строкой обязательно приводим объект к нужному типу и вызываем нужный метод</b>
            (d as Switch).ChangeState();
        }

        internal void ChangeState()
        {
            // Выполняем нужные действия по изменению внешнего вида или состояния
        }


Теперь, все что осталось - это изменить свойство SwitchState у нужного элемента. В моем случае меняется состояние в коллекции из ViewModel.

Фрагмент ViewModel:
SwitchCollection.Where(s => s.SwitchState == false)
.ToList()
.ForEach(s =>
{
   s.SwitchState = true;
});


Да простят меня гуру WPF!
  • Вопрос задан
  • 134 просмотра
Подписаться 2 Простой Комментировать
Решения вопроса 1
yarosroman
@yarosroman
C# the best
Реализуете свойство через DependecyProperty у переключателя и биндим его к в
ViewModel. https://docs.microsoft.com/ru-ru/dotnet/framework/...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы