Добрый день!
Осваиваю шаблон
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!