2008-11-19 60 views
0

我有一個ListBox控件,我想更改爲切換選擇。即點擊一個項目選擇它,再次點擊它取消選擇它。此外,單擊列表中的另一個項目應執行取消選擇前一項目並選擇新項目的默認操作。將列表框選擇更改爲切換選擇的最佳方法

實現此目的的最佳方式是什麼?

回答

2

你想要的是一個RadioButtonList。您可以通過創建一個ItemDataTemplate並在其中放置一個RadioButton來創建一個。然後,您可以修改RadioButton的模板,使其看起來像一個按鈕。

0

我會保持標準ListBox的那種方式,你會保持默認的行爲,你想要的,然後取消選擇一個項目,你可以在鼠標向下事件處理它?即使用這樣的事情:

Point newPoint = e.GetPosition(backgroundImage); 

HitTestResult result = VisualTreeHelper.HitTest(this, newPoint); 

if (result.VisualHit is ListBoxItem) 

我不知道這是否是最好的方式,唯一的其他方式我會去這樣做,這是從標準的Windows控制得到我自己的列表框,並添加一個依賴屬性允許我處理樣式中的取消選擇。如果你想採取這種方法,我不應該刪除你想要保留的默認行爲,我使用這種方法來創建一個ListBox,它將在文本旁邊顯示一個圖像。

如果你需要從哪裏開始的任何指針,然後只是給我一個呼喊。

0

我已經設法通過稍微創建兩個自定義類來實現這一點,ToggleListBox & ToggleListBoxItem。有幾個方便的覆蓋(ToggleListBox中最重要的是創建ListBoxItem的)。

從那裏很容易處理兩次點擊同一項目,或按空格/輸入鍵。這兩個類的40行代碼,並正常工作。

0

爲了防止任何人感興趣,我找到了一個不同的解決方案,這對我來說工作得非常好。我設置了ListBox.SelectionModeMultiple正是如此處理的MouseDown事件:

EventManager.RegisterClassHandler(typeof(ListBoxItem), 
    ListBoxItem.MouseLeftButtonDownEvent, 
    new RoutedEventHandler(this.HandleListBox_MouseDown)); 

... 

void HandleListBox_MouseDown(object sender, RoutedEventArgs e) 
{ 
    var listBoxItem = (ListBoxItem)sender; 
    if (ShouldDeselectOtherListItems(listBoxItem)) 
    { 
     listBox.SelectedIndex = -1; 
    } 
} 

bool ShouldDeselectOtherListItems(ListBoxItem listBoxItem) 
{ 
    return !listBoxItem.IsSelected 
     && listBox.SelectedItems.Count > 0; 
} 

如果列表框是父ListBox控件。它確保在處理系統MouseDown事件處理程序之前取消選擇所有列表框項目,從而允許切換同一個列表框項目的選擇狀態。