2013-05-03 34 views
0

剛剛開始使用C#中的數據綁定並尋求一些幫助。當將組合框的SelectedItem綁定到BusinessObject的MyEnumVar的行執行時,下面的綁定語句中斷(Visible屬性停止與MyBool & MyBoolInverse停止切換)。直接綁定到對象而不是BindingSource,或綁定到SelectedValue而不是SelectedItem,具有相同的效果。此外,MyEnumVar的值不會隨着對組合框的選擇而改變。我究竟做錯了什麼?多個控件和單個對象之間的DataBinding

public partial class Form1 : Form 
{ 
    BindingSource bs = new BindingSource(); 
    private BusinessObject bo = new BusinessObject(); 

    public Form1() 
    { 
     InitializeComponent(); 
     bs.DataSource = bo; 

     // Checkbox determines what type of dialog to display. 
     boolCheckBox.DataBindings.Add("Checked", bs, "MyBool", true, 
      DataSourceUpdateMode.OnPropertyChanged); 

     trueBox.DataBindings.Add("Visible", bs, "MyBoolInverse"); 
     falseComboBox.DataBindings.Add("Visible", bs, "MyBool"); 
     falseBox.DataBindings.Add("Visible", bs, "MyBool"); 
     falseButton.DataBindings.Add("Visible", bs, "MyBool"); 

     myEnumComboBox.DataSource = Enum.GetValues(
      typeof(BusinessObject.MyEnum)); 
     // Line below breaks above bindings, same for SelectedValue. 
     myEnumComboBox.DataBindings.Add("SelectedItem", bs, "MyEnumVar"); 
    } 
} 
class BusinessObject : INotifyPropertyChanged 
{ 
    public enum MyEnum { RED, BLU } 
    MyEnum _MyEnumVar; 
    public MyEnum MyEnumVar 
    { 
     get { return _MyEnumVar; } 
     set 
     { 
      if (value != _MyEnumVar) 
      { 
       _MyEnumVar = value; 
       NotifyPropertyChanged("MyEnumVar"); 
      } 
     } 
    } 

    private bool _MyBool; 
    public bool MyBool 
    { 
     get { return _MyBool; } 
     set 
     { 
      if (value != _MyBool) 
      { 
       _MyBool = value; 
       MyBoolInverse = !value; 
       NotifyPropertyChanged("MyBool"); 
      } 
     } 
    } 

    private bool _MyBoolInverse; 
    public bool MyBoolInverse 
    { 
     get { return _MyBoolInverse; } 
     private set 
     { 
      if (value != _MyBoolInverse) 
      { 
       _MyBoolInverse = value; 
       NotifyPropertyChanged("MyBoolInverse"); 
      } 
     } 
    } 

    public BusinessObject() 
    { 
     MyBoolInverse = !MyBool; 
     MyEnumVar = MyEnum.BLU; 
    } 

    // Boilerplate INotifyPropertyChanged implementation & helper. 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName = "") 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

你沒有說錯誤是什麼? – clearpath 2013-05-03 14:12:12

+0

編輯過,會發生什麼情況是Visible屬性在啓用最後一個綁定語句時停止在MyBool&MyBoolInverse上進行切換。 – CANTPRO 2013-05-03 14:18:34

+0

因此,爲ComboBox的SelectedValueChanged事件設置委託匿名方法按預期工作,Visible屬性綁定仍然有效。反方向與PropertyChanged事件的代表將在激活時破壞表單。我相信是這樣的,因爲我沒有將枚舉強制轉換爲適當的類型以分配給SelectedItem或SelectedValue。 – CANTPRO 2013-05-03 16:37:13

回答

0

可見屬性存在綁定問題。嘗試手動'綁定'。沿着

trueBox.Visible = bo.MyBoolInverse; 
bo.PropertyChanged += (s, e) => { 
    if(e.PropertyName == "MyBoolInverse") 
    trueBox.Visible = bo.MyBoolInverse; 
}; 

編輯東西線:此外,結合MyEnumVar不工作東陽它沒有聲明爲公共財產。

+0

屬性綁定與代理一樣保持不變。我更懷疑我是不正確地綁定了ComboBox項目/值。請記住,ComboBox的SelectedItem綁定完全不起作用,並且如果它被註釋掉,則Visible綁定工作。 – CANTPRO 2013-05-03 14:36:43

+0

@CANTPRO我已經更新了我的答案。 – clearpath 2013-05-03 14:38:00

+0

我修復了輔助功能,現在發生的情況是使用ComboBox時表單無響應。直到那時,Visibility屬性仍然不起作用。至少,表單不再更新是一個好兆頭。我開始認爲你不能直接將選擇綁定到Enum變量。 – CANTPRO 2013-05-03 14:45:41

相關問題