将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
属性(当IsOdd
为True
BackColor
设置为Color.Green
以及何时是否为False
, BackColor
设置为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
接口实现是必须的,只有当您的属性发生更改时才会立即反映在绑定中。