我的Form应用程序中有一个WinForm,其中包含一个TextBox,并且此TextBox绑定(bind)到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显示出来,用户可以在文本框中键入自己的名字,如何将BackColorForm属性绑定(bind)到IsOdd对象的Person属性(当IsOddTrueBackColor设置为Color.Green以及何时是FalseBackColor设置为Color.Red)?

最佳答案

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允许所有私有(private)代码通过setter更改属性IsOdd并正确通知更改,使用私有(private)变量isOdd不会通知更改,除非您必须在此之后添加一些通知代码。此代码也经过测试!

关于c# - 将bool属性绑定(bind)到WinForm的BackColor属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20017748/

10-17 02:20