2010-07-11 75 views
0

我之情況是這樣的:如何在Combobox綁定到數據時更改Combobox.Text屬性?

在運行時,我結合ToolStripComboBox控件到結構的陣列:

cbxTimes.ComboBox.DataSource = PlayTimeLengths; 
cbxTimes.ComboBox.DisplayMember = "Description"; 
cbxTimes.ComboBox.ValueMember = "Minutes"; 

ToolStripComboboxDropDownStyle設置爲DropDown

一切工作正常,我可以從下拉列表中選擇值,我可以在控件中寫入文本。

但是我想阻止用戶按下某些控件,並在按下某些其他控件時替換Text屬性。

我想在KeyPress事件來實現:

private void cbxTimes_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    var cbxSender = ((ToolStripComboBox)sender).ComboBox; 
    string S = cbxSender.Text; 
    //some operations on the S variable 
    cbxSender.Text = S; 
    e.Handled = true; 
} // breakpoint here shows that cbxSender.Text is not changed to S! 

所以Text屬性並未改變,但我沒有得到任何的異常。 但是,如果我進一步運行程序(我退出了調試),我發現Text屬性已更改 - 更具體。我從控制中看到來自S的文本。現在

,想象,我按第二次任意鍵,我再次在調試器在相同的事件:

private void cbxTimes_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    var cbxSender = ((ToolStripComboBox)sender).ComboBox; 
    string S = cbxSender.Text; // this time breakpoint is here 
    //some operations on the S variable 
    cbxSender.Text = S; 
    e.Handled = true; 
} // breakpoint here shows that cbxSender.Text is not changed to S! 

但是這一次我把斷點在第二行和檢查後,文本屬性我看到它仍然沒有改變。儘管事件發生後第一次我改變了它,並且控件中可以看到更改後的文本。但是在調試器中,我看到了不同的價值,我看到了開始時已經設置的價值。屬於結構數組的值。

那麼我能做些什麼來克服這個問題呢?

回答

0

老實說,這是我討厭Windows窗體數據綁定的事情之一。在WPF中,您不會直接綁定到對象,您將綁定到一個「ViewModel」對象,該對象封裝了您擁有的視圖邏輯並將其綁定到它。

我對所有這些的解決方法是根本不使用數據綁定來完成這種情況,並根據需要手動填充項目。我可以理解你爲什麼會遇到這個問題。如果你已經更新了你的底層綁定對象的.Text(或者任何導致ToString()顯示值的東西),你可能會看到你設置的新值,但這會擾亂你底層對象的語義,這不是很好事情。

+0

感謝您的回答。假設我將使用字符串填充Items []集合,有沒有什麼方法可以爲特定的字符串設置值?要有名稱 - 值對?或者,我必須獲取CurrentIndex並搜索陣列中的值:Value = MyArray [CurrentIndex]。 – Wodzu 2010-07-11 15:37:50

+0

那麼訣竅是顯示的文本是什麼.ToString()返回您使用的類。因此,只要您重寫ToString()來執行顯示,您實際上可以使用任何您喜歡的值作爲值。 – 2010-07-11 16:51:11

相關問題