将用户控件绑定到布尔属性的对面
Posted
技术标签:
【中文标题】将用户控件绑定到布尔属性的对面【英文标题】:binding a usercontrol to the opposite of a bool property 【发布时间】:2011-01-28 16:15:28 【问题描述】:非常简单:我希望与this 一样,但在winforms 中。谷歌似乎提取的所有内容都是 wpf 特定的(即。我不想引用presentationframework.dll)
如果您不想阅读链接,请说明:
以下是我想做的意图的表示,尽管它显然不起作用。
CheckBox1.DataBindings.Add(new Binding("Checked", this.object, "!SomeBool"));
【问题讨论】:
【参考方案1】:为此,我将在您拥有属性SomeBool
的同一类中创建一个名为NotSomeBool
的只读属性,并改为绑定到该属性。
【讨论】:
这会混淆域对象,为其添加特定于 UI 的行为。 +1 仍然。这是解决问题的方法,而不是我想要的。谢谢。【参考方案2】:你有两个选择:
-
手动创建
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 设计定制您的课程。
【讨论】:
我知道选项 2,我可能应该提到我不想将 UI 逻辑放在我的域模型中,这就是我没有使用它的原因。也就是说,我确实成功实施了第一个选项。非常感谢。我想为将来可能会看到这一点的任何人指出:您不能将该绑定添加到多个控件,必须为每个 UI 控件创建一个(这是我想要做的)。 +1 作为第一个选项,我试图解决同样的问题。我实现了一个扩展和一个特定的“BooleanBinding”类,您可以在其中定义是否要根据您的解决方案绑定到相反的对象!我在这里写了一篇博客:codewithpassion.blogspot.com/2010/11/…【参考方案3】:根据亚当的回答,我写了一个小助手类:
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"));
【讨论】:
对implicit operator
的很好的介绍和巧妙的使用。以上是关于将用户控件绑定到布尔属性的对面的主要内容,如果未能解决你的问题,请参考以下文章