2009-11-26 61 views
7

我有一個包含複選框的列的數據網格。我想改變裝訂選屬性的值被點擊行時:Silverlight Datagrid行點擊

alt text http://lh4.ggpht.com/_L9TmtwXFtew/Sw6YtzRWGEI/AAAAAAAAGlQ/pntIr2GU6Mo/image_thumb%5B3%5D.png

注意:我不想用SelectedItemChanged事件,因爲這並不能正常工作,只有一個時在網格中排。

+0

您想要再次點擊該行時切換嗎?點擊行中是否有任何地方不應該有這種效果? – AnthonyWJones 2009-11-26 16:28:15

回答

7

由於經常是我發現我自己的解決方案,這種方式:

添加的MouseLeftButtonUp事件到DataGrid:

<data:DataGrid x:Name="dgTaskLinks" 
ItemsSource="{Binding TaskLinks}" 
SelectedItem="{Binding SelectedTaskLink, Mode=TwoWay}" 
MouseLeftButtonUp="dgTaskLinks_MouseLeftButtonUp" 
>... 

而且walk the visual tree獲取數據網格行:

private void dgTaskLinks_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
      { 
       ///get the clicked row 
       DataGridRow row = MyDependencyObjectHelper.FindParentOfType<DataGridRow>(e.OriginalSource as DependencyObject); 

       ///get the data object of the row 
       if (row != null && row.DataContext is TaskLink) 
       { 
        ///toggle the IsSelected value 
        (row.DataContext as TaskLink).IsSelected = !(row.DataContext as TaskLink).IsSelected; 
       } 

      } 

一旦找到,它是一個簡單的方法來切換綁定的IsSelected屬性:-)

希望這可以幫助別人。

+0

我喜歡你的解決方案。它比我的更有意義。雖然,我想知道你從哪裏得到這個'MyDependencyObjectHelper'類。我假設你的自定義代碼。小心分享它? – 2010-02-25 06:36:09

+0

它在「漫遊視覺樹」下的答案中鏈接。 GLad幫助,Mark – 2010-02-26 07:32:38

+0

+1偉大的解決方案!我花了3個小時試圖破解一個網格來「自動選擇」一個複選框,並沒有提出任何接近優雅的東西。 – 2010-04-01 20:38:07

0

這裏有一個更簡單的解決方案

XAML

<data:DataGrid 
x:Name="dgMyDataGrid" 
ItemsSource="{Binding MyList}" 
SelectedItem="{Binding MyList, Mode=TwoWay}" 
MouseLeftButtonUp="dgMyDataGrid_MouseLeftButtonUp">... 

CS

private void dgMyDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    DataGrid dg = (sender as DataGrid); 
    var allObjects = dg.DataContext as List<MyCustomObject>; 
    foreach(var o in allObjects) 
    { 
      o.Selected = false; 
    } 

    MyCustomObject SelectedObject = (MyCustomObject)dg.SelectedItem; 
    SelectedObject.Selected = true; 
} 

注:這個問題,以及其他的例子假設你的類所綁定的控件實現INotifyPropertyChanged