#c# #wpf #domain-model
#c# #wpf #модель домена
Вопрос:
У меня есть класс poco в моей модели домена:
public class Slot
{
bool HasPlayed { get; set; }
}
И я отображаю его в шаблоне элемента списка.
<Border Background="...">
<CheckBox IsChecked="{Binding Path=HasPlayed, Mode=TwoWay}" />
</Border>
Но то, что я хочу сделать, это когда значение HasPlayed равно true, цвет фона границы становится красным, а при false — зеленым. Эти кисти находятся в словаре ресурсов.
Я мог бы добавить кисть к модели домена, но это сводит на нет разделение проблем. Я также не собираюсь использовать флажок в будущем, это всего лишь макет пользовательского интерфейса.
Я пробовал IValueConverter, но он не меняется при изменении свойства. Модель действительно реализует INotifyPropertyChanged.
Как бы вы изменили цвет при изменении свойства?
Комментарии:
1. Как выглядит ваш код IValueConverter?
2. Изначально он окрашивает границу, но когда происходит изменение свойства, оно не обновляется.
Ответ №1:
Вы могли бы использовать DataTrigger для запуска действия:
http://en.csharp-online.net/WPF_Styles_and_Control_Templates—Data_Triggers
Ответ №2:
Я предполагаю, что изменение свойства не улавливается, потому что Slot не реализует INotifyPropertyChanged .
Попробуйте что-то вроде этого:
public class Slot : INotifyPropertyChanged
{
private bool _hasPlayed;
private bool HasPlayed
{
get { return _hasPlayed; }
set
{
_hasPlayed = value;
InvokePropertyChanged(new PropertyChangedEventArgs("HasPlayed"));
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
public void InvokePropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, e);
}
}
}
Комментарии:
1. Он реализует INotifyPropertyChanged.
Ответ №3:
Значение, которое вы передаете в свой конвертер, похоже, равно a Slot
, поэтому привязка не указывает на свойство, которое изменяется, однако для обновления привязки в привязке необходимо указать путь, который указывает на соответствующее свойство, в данном случае HasPlayed
. (И объект, владеющий свойством, конечно, должен реализовать INPC, но вы сказали, что это уже так, правильно?)