2010-03-17 75 views
13

非常簡單:我正在尋找和this一樣的工具,但是使用winforms。 ,谷歌似乎拉起一切是WPF特定的(即我不想引用presentationframework.dll)將用戶控件綁定到bool屬性的相反位置

解釋的。如果你不想閱讀鏈接:

以下是代表我想做什麼的意圖,儘管它顯然不起作用。

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

回答

16

你有兩個選擇:

  1. 手動創建Binding對象,並連接到FormatParse事件,並在每個交換價值。
  2. 創建的,只是顛倒了預期的屬性

第一個選項是清潔的,海事組織,因爲它不強迫你的類的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設計。

+0

+1我喜歡你的第一個選項,不知道它:-) – Javier 2010-03-17 17:02:47

+0

我知道選項2,我可能應該提到我不想把UI邏輯放在我的領域模型中,這就是爲什麼我沒有跟它去。也就是說,我確實成功實施了第一個選項。非常感謝你。我想指出任何可能在將來看到這個的人:你不能將該綁定添加到多個控件,必須根據UI控件創建一個(這正是我想要的)。第一個選項爲 – 2010-03-17 17:14:04

+1

+1,我試圖解決同樣的問題。我實現了一個擴展和一個特定的'BooleanBinding'類,您可以根據您的解決方案定義是否想要綁定到相反的對象!我在這裏發表了博文:http://codewithpassion.blogspot.com/2010/11/binding-to-opposite-value-of-boolean.html – 2010-11-28 01:17:03

1

要做到這一點,我倒是做一個名爲NotSomeBool一個只讀屬性,在你擁有的財產SomeBool同一類,並綁定到該屬性。

+0

,混淆域對象,將UI特定的行爲給它。 – 2010-03-17 17:03:11

+0

對,這就是爲什麼我更喜歡亞當的答案:-)謝謝! – Javier 2010-03-17 17:09:11

+0

+1仍然。這是解決問題的辦法,而不是我所期待的。謝謝。 – 2010-03-17 17:17:12

6

基於亞當的答案,我寫了一個小的輔助類:

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")); 
+0

介紹隱式運算符和巧妙使用它。 – avenmore 2016-02-12 11:44:58

相關問題