2011-03-21 40 views
1

我有一個Silverlight 4.0數據網格,其中SelectionMode設置爲Single。問題在於用戶需要CTRL +單擊已選擇的行才能取消選擇(並且沒有在網格中選擇任何內容)。我希望他們能夠簡單地左鍵單擊已選擇的行以取消選中它。從Silverlight數據網格取消選擇項目,如果它被點擊兩次

我試圖用SelectionChanged事件(檢查事件參數中添加的項目)執行此操作,但它不起作用,因爲當用戶單擊同一行兩次時不會引發事件。

有什麼建議嗎?

+0

這是DataGrid只讀嗎? – 2011-03-21 21:03:32

+0

這是正確的。用戶不能直接編輯網格中的項目。 – 2011-03-21 21:04:41

回答

0

我也有同樣的任務,所以在這裏是我的解決方案: 使用AddHandler dataGrid.AddHandler(UIElement.MouseLeftButtonDownEvent,new MouseButtonEventHandler(DataGrid_MouseLeftButtonDown),true)爲datagrid的MouseLeftButtonDown事件附加處理程序; ,保存的SelectedIndex在私有變量

private int prevSelectedIndex; 
    void DataGrid_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     if (prevSelectedIndex != -1 && prevSelectedIndex == dataGrid.SelectedIndex) 
     { 
      dataGrid.SelectedIndex = -1; 
     } 
     prevSelectedIndex = dataGrid.SelectedIndex; 
    } 

,如果你想重新使用這個邏輯,你可以創建一個DataGrid的行爲類型

添加System.Windows.Interactivity裝配基準,添加類DataGridSecondClickUnselectBehavior

public class DataGridSecondClickUnselectBehavior : Behavior<DataGrid> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     AssociatedObject.AddHandler(UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown), true); 
    } 

    private int prevSelectedIndex; 
    void AssociatedObject_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     if (prevSelectedIndex != -1 && prevSelectedIndex == AssociatedObject.SelectedIndex) 
     { 
      AssociatedObject.SelectedIndex = -1; 
     } 
     prevSelectedIndex = AssociatedObject.SelectedIndex; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 

     AssociatedObject.RemoveHandler(UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown)); 
    } 
} 

現在,在混合編譯解決方案後,您可以將此行爲簡單地從資產→行爲拖放到DataGrid控件

相關問題