将bool属性绑定到WinForm的BackColor属性

我在WinForm应用程序中有一个Form ,它包含一个TextBox ,这个TextBox绑定到Person对象的FirstName属性。

 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,如何将Form BackColor属性绑定到Person对象的IsOdd属性(当IsOddTrue BackColor设置为Color.Green以及何时是否为FalseBackColor设置为Color.Red )?

winforms Binding也与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实现。 您还可以使用在WPF更熟悉的INotifyPropertyChanged 。 这是修改后的类:

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

你无法将Color属性绑定到bool你必须做这样的事情。 添加类型为Color的readonly属性取决于您的布尔值并绑定它。

 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接口实现是必须的,只有当您的属性发生更改时才会立即反映在绑定中。