Привязка логического свойства к свойству BackColor формы WinForm

У меня есть Form в моем приложении WinForm, которое содержит TextBox и это TextBox привязывается к свойству FirstName объекта Person.

public class Person
{
   string firstName;
   public string FirstName
   {
      get { return firstName; }
      set { 
           firstName = value; 
           this.isOdd = value.Length % 2;
          }
   }

   bool isOdd;  
   public bool IsOdd { get {return isOdd; } }
}

Когда мое приложение запускается, это Form показывает, и пользователь может ввести свое имя в TextBox. Как я могу привязать свойство BackColor объекта Form к свойству IsOdd объекта Person (когда IsOdd равно True BackColor установлено значение Color.Green, а когда оно равно False BackColor установлено на Color.Red)?


person Masoud    schedule 16.11.2013    source источник
comment
Можете ли вы опубликовать код привязки свойства имени к тексту текстового поля?   -  person nvoigt    schedule 16.11.2013


Ответы (2)


Binding в winforms также имеет что-то очень похожее на wpf. В WPF у вас есть Converter, а в winforms это поддерживается событием под названием Format. Вы можете попробовать этот код:

Binding bind = new Binding("BackColor", person, "IsOdd");
bind.Format += (s, e) => {
   e.Value = (bool)e.Value ? Color.Green : Color.Red;
};
control.DataBindings.Add(bind);

Для класса Person его нужно немного изменить. В winforms есть шаблон для уведомления об изменениях с использованием события с именем EventNameChanged вместе с рейзером с именем OnEventNameChanged. Вы можете обнаружить, что этот шаблон реализован в основном в winforms. Вы также можете использовать INotifyPropertyChanged, который более знаком в WPF. Вот измененный класс:

public class Person {
  string firstName;
  public string FirstName {
     get { return firstName; }
     set {
           firstName = value;
           IsOdd = value.Length % 2 != 0;//Note use IsOdd not isOdd
         }
  }
  bool isOdd;
  public bool IsOdd {
    get { return isOdd; }
    private set { 
         if(isOdd != value){
           isOdd = value;
           OnIsOddChanged(EventArgs.Empty);
         }
    }
    public event EventHandler IsOddChanged;
    protected virtual void OnIsOddChanged(EventArgs e) {
      var handler = IsOddChanged;
      if (handler != null) handler(this, e);
    }        
}

ПРИМЕЧАНИЕ. Вы можете использовать private set, чтобы разрешить всему частному коду изменять свойство IsOdd через установщик и правильно уведомлять об изменениях. что. Этот код также Проверен!.

person King King    schedule 16.11.2013

Вы не можете точно привязать свойство Color к bool, вам придется сделать что-то вроде этого. Добавьте свойство только для чтения типа Color в зависимости от вашего логического значения и привяжите его.

internal class MyClass : INotifyPropertyChanged
{
    private bool _isOdd;
    public bool IsOdd 
    {
        get
        {
            return _isOdd;
        }
        set
        {
            _isOdd = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("IsOdd"));
                PropertyChanged(this, new PropertyChangedEventArgs("Color"));
            }
        }
    }

    public Color Color
    {
        get
        {
            return (IsOdd) ? Color.Green : Color.Red;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Затем просто привяжите этот экземпляр класса к свойству BackColor любого элемента управления.

control.DataBindings.Add("BackColor", myclass, "Color");

Примечание. Реализация интерфейса INotifyPropertyChanged обязательна, только тогда, когда есть изменение в вашем свойстве, которое немедленно отразится в привязках.

person Sriram Sakthivel    schedule 16.11.2013
comment
Вы уверены, что это System.Windows.Forms? Потому что он выглядит так же, как WPF. - person nvoigt; 16.11.2013
comment
@nvoigt С чего вы взяли, что это WPF? это абсолютно Winforms живет в System.Windows.Forms.dll. Кстати, я не знаком с WPF :) Я только что проверил его с Form перед публикацией, он работает. - person Sriram Sakthivel; 16.11.2013
comment
Вы правы, кажется, что привязка данных WinForms работает намного больше, чем WPF, чем я думал. Никогда не знал, что знаю WinForms Binding :) - person nvoigt; 16.11.2013