2009-10-27 63 views
1

我對這個WPF事情很恐怖,所以請耐心等待。我使用WPF的Xceed DataGrid,我需要知道什麼時候有人選擇一行,但我不知道如何做到這一點。我確定我需要添加一些XAML來實現這一點,但我無法弄清楚我應該做什麼。我如何檢測Xceed DataGrid中WPF的行選擇

回答

1

我實際上正在努力與自己同樣的事情,除了我有一個先決條件,通過ICommand的選擇通知;但是,如果您沒有此需求,則可以連接SelectionChanged事件處理程序。這是很基本的東西,但我會包括以防萬一代碼:

XAML:

<Grid> 
    <DataGrid:DataGridControl x:Name="gridControl" SelectionChanged="gridControl_SelectionChanged"> 
     <!-- Content --> 
    </DataGrid:DataGridControl> 
</Grid> 

代碼隱藏:

private void gridControl_SelectionChanged(object sender, Xceed.Wpf.DataGrid.DataGridSelectionChangedEventArgs e) 
     { 
     var selectedIndex = gridControl.SelectedIndex; // int index 
     var selectedItem = gridControl.SelectedItem; // instance of bound object 
     var selectedItems = gridControl.SelectedItems; // IList of bound objects 
     } 

所有這一切說,我很感興趣聽聽是否有任何優雅的解決方案,用ICommand從Xceed DataGrid中獲取所選行(在我的情況下,我使用的是匿名類型,這可能會產生變化)...

+0

我的Xceed網格沒有這個事件,所以它不是真的可能。你有專業版嗎? –

+0

啊,是的,我確實......沒有意識到他們會限制事件處理程序。對我來說似乎很陌生。 – egoodberry

0

所以,我來了你p與

System.ComponentModel.DependencyPropertyDescriptor gridItemsSourceDescriptor = System.ComponentModel.DependencyPropertyDescriptor.FromProperty(DataGridControl.SelectedItemProperty, typeof(DataGridControl)); 
    gridItemsSourceDescriptor.AddValueChanged(dgBaxRuns, HandleSelectionChanged); 
+0

應該小心使用這些描述符,因爲它們會導致內存泄漏。 http://support.microsoft.com/kb/938416 –

3

我使用MVVM方法,因此有利於數據綁定。我將SelectedItem屬性綁定到網格的ViewModel對象上的SelectedItem屬性。

<xcdg:DataGridControl x:Name="grid" SelectedItem="{Binding SelectedItem}"> 
</xcdg:DataGridControl> 

然後你的屬性setter可以做SelectedItemChanged()方法改變時所需要的。

private IMyItem _selectedItem; 
public IMyItem SelectedItem 
{ 
    get { return _selectedItem; } 
    set { 
      _selectedItem = value; 
      OnPropertyChanged("SelectedItem"); 
      SelectedItemChanged(); 
     } 
} 
1

您不必爲簡單的事情編寫複雜的代碼......雖然它會變得單調乏味,但下面是一些代碼。我希望這會有所幫助:

<Style TargetType="xcdg:DataRow"> 
    <EventSetter Handler="dr_PreviewMouseDown" Event="PreviewMouseDown" /> 
</Style> 

void dr_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    DataRow dr = sender as DataRow; 

    Debug.WriteLine(sender); 
} 
0

我爲我製造了一個最簡單的方法。

<xctk:MaterialButton Margin="5,0,5,0" Grid.Column="3" Content="Szűrt sorok kijelölése" Command="{Binding SelectFilteredRowsCommand}" CommandParameter="{Binding ElementName=MyDataGrid}" /> 

所以,我發送我的datagrid與我的commandparameter到viewmodel。

public RelayCommand<object> SelectFilteredRowsCommand { get; set; } 

SelectFilteredRowsCommand = new RelayCommand<object>((o) => 
      { 
       var datagrid = o as DataGridControl; 
       if (datagrid != null) 
       { 
        var datagriditems = datagrid.Items.Cast<SelectableProduct>(); 
        foreach (SelectableProduct selectableProduct in datagriditems) 
        { 
         selectableProduct.IsSelect = true; 
        } 
       } 
      }); 

並轉換回datagrid itemsoruce類型。