2009-09-12 105 views
1

我有一個有趣的與combobox相關的數據綁定問題。希望有人有一些好的建議。組合框數據綁定問題

我有一個簡單的表單,它包含一個文件選取器和一個comboxbox。每次選擇文件時,我都會從文件讀取一個字符串列表到一個List對象,並設置comboBox.DataSource = listOfStrings。在表單加載事件中,我設置了comboBox.DataBindings.Add(「SelectedItem」,myObject,「PickedValue」);

目的很明確:每次從組合框中選擇一個字符串時,我想將該字符串寫入myObject.PickedValue。

這就是整個故事。

現在我啓動表單,而不是去選擇一個文件,我先檢查組合框。當然,在這一點上,comboBox.DataSource爲null,comboBox.SelectedItem也爲null。但是comboBox上的數據綁定已經設置好了(因爲設置在表單加載事件中)。現在我的焦點不能從組合框移動到其他任何地方。

我認爲原因是,當我嘗試檢查組合框時,它作爲SelectedItem爲null。當我嘗試將焦點移到其他地方時,觸發組合框的數據綁定。基礎上,它會嘗試將選定的項目轉換爲字符串,並使用該轉換後的字符串更新myObject.PickedValue。由於您無法將null轉換爲字符串,因此數據綁定驗證失敗,並且驗證機制不允許將我的焦點移到其他地方,而我在此刻被吸引,甚至無法移動以選擇文件。

我的問題是,我的應用場景中的常規綁定設置工作流程是什麼以防止此陷阱?設置這種數據綁定的正確順序是什麼,所以我可以在數據源被某些東西填滿之前檢查我的組合框?我試圖將myObject.PickedValue綁定到組合框的SelectedText屬性(我注意到SelectedText是一個字符串,並且永遠不會爲null,即使SelectedItem爲null)。但有趣的是,即使我從組合框中選擇了某些東西,當數據綁定被觸發時,SelectedText仍然是空字符串。這裏有什麼問題?

感謝您的任何幫助。

回答

1

這看起來不對;應該可以將字符串屬性設置爲null。可能焦點問題在於別處。你有沒有試過在你的物業設置上設置一個斷點來確認你的理論?

組合框的SelectedText屬性是指已在組合框的文本部分中選定的文本。這僅適用於下拉樣式設置爲組合的情況。基本上它是組合控件的文本框部分的選定文本(組合控件被稱爲「組合」的原因是因爲它是文本框和選擇列表的組合)。除非用戶正在編輯組合的文本部分,否則通常會希望此屬性爲空。

如果您想要解決與良好用戶體驗相一致的此問題的解決方法,請嘗試禁用表單加載時的組合框,然後在選取文件時啓用該組合框。

+0

感謝您給我一個解決方法。我認爲禁用組合框直到準備就緒是個好主意。謝謝你解釋爲什麼SelectedText屬性不適合我。我想我會以此作爲答案。 – Steve 2009-09-13 22:52:39

3

失敗比您描述的要簡單一點:您的ComboBox將因爲沒有選定項目而失敗,因爲沒有選定項目。

如果沒有什麼可供選擇的話,我只會禁用ComboBox。這很容易做到。請記住在數據對象中掛接一個PropertyChanged事件;綁定源將通過反射自動找到它。

class MyData 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    // ... 
    public HasListOfStrings { get { return ListOfStrings != null && 0 < ListOfStrings.Count; } } 

    private void LoadListOfStrings 
    { 
     // ... load the list of strings ... 

     if (PropertyChanged) { 
      PropertyChanged(this, "ListOfStrings"); 
      PropertyChanged(this, "HasListOfStrings"); 
     } 
    } 
} 

在設計,結合了「組合框」到HasListOfStrings屬性的「已啓用」屬性。你可以做到這一點的代碼:

listOfStringsComboBox.Bindings.Add ("Enabled", bindingSource, "HasListOfStrings"); 

我也建議你容器(或容器的容器)的AutoValidate屬性更改爲EnableAllowFocusChange

+0

感謝拉里的解決方法。這個想法與Paul的相似,特別感謝你的代碼。我只是因爲他回答了我的SelectedText問題纔將他作爲答案。但基本上你的和他一樣有幫助。乾杯。 – Steve 2009-09-13 22:53:58

+0

很高興能幫到你! – XXXXX 2009-09-14 01:01:16