2014-11-03 54 views
0

我編寫了一個通過ConnectionString與SQL Anywhere數據庫建立連接的工具。 我想要接收一些數據並通過Loaded Event將它們綁定到ComboBox。C# - 組合框中的數據翻倍(SQLAnywhere連接)

private void VesselNoComboBox_Loaded(object sender, RoutedEventArgs e) { ListShipNames(); }

/// <summary> 
    /// Receive all vessels from Database and add them to the combobox. 
    /// A variable Database connection has to be built. 
    /// </summary> 
    private void ListShipNames() 
    { 
     SAConnection sqlCon = new SAConnection(); 
     sqlCon.ConnectionString = "Data Source=****; User id=****; Password=****"; 
     try 
     { 
      sqlCon.Open(); 
      SACommand cmd = new SACommand("Select ID || ' ' || NAME from test.SHIP_DATA", sqlCon); 
      SADataReader reader = cmd.ExecuteReader(); 
      while (reader.Read()) 
      { 
       VesselNoComboBox.Items.Add(reader.GetString(0)); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error ", MessageBoxButton.OK, MessageBoxImage.Exclamation); 
     } 
     finally 
     { 
      sqlCon.Close(); 
     } 
    } 

在WPF啓動程序當所述第一ComboBox_Loaded將被執行。然後當UserControl將被加載。所有數據都會翻倍。明確的Clear()將刪除組合框條目。 有人可以給我一個提示嗎?

+0

您是通過模板還是通過應用模板中的代碼加載控件? – 2014-11-03 22:21:51

+0

不,我直接在我的WPF窗口中加載UserControl。如:xmlns:tabData="clr-namespace:xxx.UserControls"並參考它 2014-11-04 15:58:37

回答

0

沒有關於您的解決方案的進一步信息,我不能給你一個理由。我可以告訴你,當控件從模板中加載時,加載的事件可以被多次觸發。這是因爲每次將控件包含在可視化樹中時,都會觸發Loaded事件,原因可能是由Mike Hillberg的MSDN blog引起的。

注意:您可能不知道您是從模板加載的。例如,選項卡控件將每個選項卡視爲模板,當您單擊該選項卡時將其加載,並在您移出時將其卸載。 Philipp Sumi描述了這個問題here

解決方法是確保您的數據加載代碼不在控件加載事件中。

更多的WPF解決方案將使用數據綁定。而不是加載數據並直接將其添加到控件。爲此,

  1. 爲您的視圖模型設置數據上下文。
  2. 填充ObservableCollection,可能在您的ViewModel的構造函數中。
  3. 將組合框的ItemsSource屬性綁定到集合。

我希望這會有所幫助。

+0

謝謝您的信息!這是一個很好的暗示。我已經通過在App加載後明確地清除ComboBox來測試它。但我會改變它使用ObservableCollection,我會綁定ItemsSource。 – 2014-11-06 16:56:58