非常簡單:我正在尋找和this一樣的工具,但是使用winforms。 ,谷歌似乎拉起一切是WPF特定的(即我不想引用presentationframework.dll)將用戶控件綁定到bool屬性的相反位置
解釋的。如果你不想閱讀鏈接:
以下是代表我想做什麼的意圖,儘管它顯然不起作用。
CheckBox1.DataBindings.Add(new Binding("Checked", this.object, "!SomeBool"));
非常簡單:我正在尋找和this一樣的工具,但是使用winforms。 ,谷歌似乎拉起一切是WPF特定的(即我不想引用presentationframework.dll)將用戶控件綁定到bool屬性的相反位置
解釋的。如果你不想閱讀鏈接:
以下是代表我想做什麼的意圖,儘管它顯然不起作用。
CheckBox1.DataBindings.Add(new Binding("Checked", this.object, "!SomeBool"));
你有兩個選擇:
第一個選項是清潔的,海事組織,因爲它不強迫你的類的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設計。
要做到這一點,我倒是做一個名爲NotSomeBool
一個只讀屬性,在你擁有的財產SomeBool
同一類,並綁定到該屬性。
,混淆域對象,將UI特定的行爲給它。 – 2010-03-17 17:03:11
對,這就是爲什麼我更喜歡亞當的答案:-)謝謝! – Javier 2010-03-17 17:09:11
+1仍然。這是解決問題的辦法,而不是我所期待的。謝謝。 – 2010-03-17 17:17:12
基於亞當的答案,我寫了一個小的輔助類:
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"));
介紹隱式運算符和巧妙使用它。 – avenmore 2016-02-12 11:44:58
+1我喜歡你的第一個選項,不知道它:-) – Javier 2010-03-17 17:02:47
我知道選項2,我可能應該提到我不想把UI邏輯放在我的領域模型中,這就是爲什麼我沒有跟它去。也就是說,我確實成功實施了第一個選項。非常感謝你。我想指出任何可能在將來看到這個的人:你不能將該綁定添加到多個控件,必須根據UI控件創建一個(這正是我想要的)。第一個選項爲 – 2010-03-17 17:14:04
+1,我試圖解決同樣的問題。我實現了一個擴展和一個特定的'BooleanBinding'類,您可以根據您的解決方案定義是否想要綁定到相反的對象!我在這裏發表了博文:http://codewithpassion.blogspot.com/2010/11/binding-to-opposite-value-of-boolean.html – 2010-11-28 01:17:03