将usercontrol绑定到bool属性的反面

时间:2010-03-17 16:41:41

标签: c# winforms data-binding

非常直截了当:我希望和this一样,但是在winforms中。 google似乎拔出的所有内容都是特定于wpf的(即我不想引用presentationframework.dll)

解释如果您不想阅读链接:

以下是我想做的意图的表示,虽然它显然不起作用。

CheckBox1.DataBindings.Add(new Binding("Checked", this.object, "!SomeBool"));

3 个答案:

答案 0 :(得分:22)

您有两种选择:

  1. 手动创建Binding对象并附加到FormatParse事件并交换每个事件中的值。
  2. 在类上创建一个仅反转目标属性逻辑的​​附加属性
  3. 第一个选项是清洁,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的只读属性,并改为绑定到此属性。