Цвет границы на основе модели домена?

#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, но вы сказали, что это уже так, правильно?)