Цвет границы в зависимости от модели домена? - PullRequest
1 голос
/ 16 октября 2011

В моей модели предметной области есть класс poco:

public class Slot
{
    bool HasPlayed { get; set; }
}

И я отображаю его в шаблоне элемента списка.

<Border Background="...">
    <CheckBox IsChecked="{Binding Path=HasPlayed, Mode=TwoWay}" />
</Border>

Но то, что я хочу сделать, это когда значение HasPlayed равно true, цвет фона границы становится красным, а когда false, то зеленым. Эти кисти находятся в словаре ресурсов.

Я мог бы добавить Brush к модели предметной области, но это побеждает разделение проблем. Я также НЕ собираюсь использовать этот флажок в будущем, это всего лишь макет пользовательского интерфейса.

Я пробовал IValueConverter, но он не меняется при изменении свойства. Модель реализует INotifyPropertyChanged.

Как бы вы изменили цвет при изменении свойства?

Ответы [ 3 ]

1 голос
/ 16 октября 2011

Вы можете использовать DataTrigger для запуска действия:

http://en.csharp -online.net / WPF_Styles_and_Control_Templates% E2% 80% 94Data_Triggers

0 голосов
/ 16 октября 2011

Значение, которое вы передаете в конвертер, выглядит как Slot, поэтому привязка не указывает на свойство, которое изменяется, для привязки для обновления, однако привязка должна указывать путь, который указывает на соответствующее свойство, в этом случае HasPlayed. (И объект, владеющий свойством, конечно, должен реализовать INPC , но вы сказали, что это уже так, правильно?)

0 голосов
/ 16 октября 2011

Я предполагаю, что изменение свойства не происходит, потому что 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);
            }
        }
    }
...