У меня сейчас есть расширенный набор инструментов WPF Toolkit Color Picker. Когда я выбираю цвет в подборщике цветов, цвет границы изменяется на выбранный цвет. Это работает прямо сейчас, смотрите следующий GIF:INotifyPropertyChanged ничего не делает
Есть несколько вещей неправильно. Когда я извлекаю интерфейс INotifyPropertyChanged
и метод OnPropertyChanged()
, все еще работает отлично (почему ?! Это не должно, верно?)
Кроме того, когда я добавить точку останова на сеттера собственности BackgroundColor в моем классе MyStyle, свойство не обновляется. Он должен обновлять, потому что я связываю его с помощью следующей строки: b.Path = new PropertyPath(nameof(BackgroundColor));
Мои вопросы:
- Почему это все еще работает, когда я удалить все вещи INotifyPropertyChanged
- Почему не свойство BackgroundColor моего обновления объекта, когда я изменить цвет (почему он не попал в сеттер точку останова)
У меня есть следующие ViewModel:
public class BoxViewModel : INotifyPropertyChanged
{
private string _backgroundcolor;
public string Description { get; set; }
public string BackgroundColor
{
get
{
return _backgroundcolor;
}
set
{
_backgroundcolor = value;
OnPropertyChanged();
}
}
/// <summary>
/// Occurs when [property changed].
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Который работает со следующей моделью:
public class Box : MyStyle
{
Canvas _label;
Border _border;
string _description;
BoxViewModel vm;
public override void Draw(Canvas label)
{
_label = label;
_border = new Border();
_border.BorderBrush = BorderColorBrush;
_border.Background = BackgroundColorBrush;
_border.Width = Width;
_border.Height = Height;
//
_border.DataContext = vm;
Binding b = new Binding();
b.Source = vm;
b.Path = new PropertyPath(nameof(BackgroundColor));
b.Mode = BindingMode.TwoWay;
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(_border, Border.BackgroundProperty, b);
label.Children.Add(_border);
}
internal override void AddInputs(ItemsControl inputPanel)
{
vm = new BoxViewModel()
{
Description = _description,
BackgroundColor = BackgroundColor
};
inputPanel.Items.Add(vm);
}
}
И тогда MyStyle это абстрактный класс с кучей свойств, как BackgroundColor один:
public abstract class MyStyle
{
string _BackgroundBrush;
string _BackgroundColor;
.....
public string BorderColor
{
get { return _BorderColor; }
set
{
_BorderColor = value;
BorderColorBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString(value != null ? BorderColor : "#FFFFFFFF"));
}
}
public SolidColorBrush BorderColorBrush { get; set; }
public string BackgroundColor {
get { return _BackgroundColor; }
set {
_BackgroundColor = value;
BackgroundColorBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString(value != null ? BackgroundColor : "#FFFFFFFF"));
}
}
public SolidColorBrush BackgroundColorBrush { get; set; }
.....
}
Редактировать
Он обновляет свойство BoxViewModel.BackgroundColor
, и эти сеттеры и получатели вызывают, когда цвет i s изменено. Тем не менее ничего не происходит с MyStyle.BackgroundColor
не меняется. Есть ли у него что-то делать с контекстом данных или с привязывающим свойством или чем-то еще? И строка BackgroundColor, и BackgroundColors из класса mystyle должны измениться.
'public class Box: MyStyle' wat – Will
@ Извините, я переименовал его для целей вопроса, но сделал орфографическую ошибку. Стиль абстрактного класса должен быть MyStyle (со свойствами фона) – Markinson
Я новичок в Binding и WPF, поэтому у меня есть только предположение: вы привязываете View и класс Box. Нет никаких привязок к классу ViewModel. Возможно, вам следует создать экземпляр класса Box в вашей ViewModel, а не экземпляр из ViewModel в классе Box !? ViewModel управляет всем. Затем получить данные из класса Box и привязать его к ViewModel. Надеюсь, это не совсем так. : D –