2009-10-27 28 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类型。