非常直截了当:我希望和this一样,但是在winforms中。 google似乎拔出的所有内容都是特定于wpf的(即我不想引用presentationframework.dll)
解释如果您不想阅读链接:
以下是我想做的意图的表示,虽然它显然不起作用。
CheckBox1.DataBindings.Add(new Binding("Checked", this.object, "!SomeBool"));
答案 0 :(得分:22)
您有两种选择:
Binding
对象并附加到Format
和Parse
事件并交换每个事件中的值。第一个选项是清洁,IMO,因为它不会强制您的类的API遵循您的UI设计,尽管第二个选项(稍微)更容易。
选项1的示例
private void SwitchBool(object sender, ConvertEventArgs e)
{
e.Value = !((bool)e.Value);
}
...
Binding bind = new Binding("Checked", this.object, "SomeBool");
bind.Format += SwitchBool;
bind.Parse += SwitchBool;
CheckBox1.DataBindings.Add(bind);
选项2的示例
public class SomeClass
{
public bool SomeBool { get; set; }
public bool NotSomeBool
{
get { return !SomeBool; }
set { SomeBool = !value; }
}
}
...
CheckBox1.DataBindings.Add("Checked", this.object, "NotSomeBool");
同样,我非常赞成选项1,因为选项2要求您根据UI设计定制类。
答案 1 :(得分:9)
根据亚当的答案,我写了一个小帮手类:
class NegateBinding
{
string propertyName;
object dataSource;
string dataMember;
public NegateBinding(string propertyName, object dataSource, string dataMember)
{
this.propertyName = propertyName;
this.dataSource = dataSource;
this.dataMember = dataMember;
}
public static implicit operator Binding(NegateBinding eb)
{
var binding = new Binding(eb.propertyName, eb.dataSource, eb.dataMember, false, DataSourceUpdateMode.OnPropertyChanged);
binding.Parse += new ConvertEventHandler(negate);
binding.Format += new ConvertEventHandler(negate);
return binding;
}
static void negate(object sender, ConvertEventArgs e)
{
e.Value = !((bool)e.Value);
}
}
现在您可以像这样使用它:
label1.DataBindings.Add(new NegateBinding("Visible", otherObject, "HasData"));
答案 2 :(得分:1)
为此,我将在您拥有属性NotSomeBool
的同一个类中执行名为SomeBool
的只读属性,并改为绑定到此属性。