我对这个 WPF 的事情很可怕,所以请耐心等待。
我正在为 WPF 使用 Xceed DataGrid,我需要知道何时有人选择了一行,但我不知道该怎么做。我确定我需要添加一些 XAML 来启用它,但我不知道我应该做什么。
我使用 MVVM 方法,因此支持数据绑定。我会将 SelectedItem 属性绑定到网格的 ViewModel 对象上的 SelectedItem 属性。
<xcdg:DataGridControl x:Name="grid" SelectedItem="{Binding SelectedItem}">
</xcdg:DataGridControl>
然后,您的属性设置器可以在 SelectedItemChanged() 方法发生更改时执行任何必要的操作。
private IMyItem _selectedItem;
public IMyItem SelectedItem
{
get { return _selectedItem; }
set {
_selectedItem = value;
OnPropertyChanged("SelectedItem");
SelectedItemChanged();
}
}
您不必为简单的事情编写复杂的代码......虽然它可能会变得乏味,但这里有一些代码适合您。我希望这有帮助:
<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);
}
实际上,我自己也在为同样的事情苦苦挣扎,除了我有一个先决条件是通过 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 中获取选定的行(在我的情况下,我使用的是匿名类型,这可以产生影响)......
所以这就是我想出的
System.ComponentModel.DependencyPropertyDescriptor gridItemsSourceDescriptor = System.ComponentModel.DependencyPropertyDescriptor.FromProperty(DataGridControl.SelectedItemProperty, typeof(DataGridControl));
gridItemsSourceDescriptor.AddValueChanged(dgBaxRuns, HandleSelectionChanged);
我为我做了一个最简单的方法。
<xctk:MaterialButton Margin="5,0,5,0" Grid.Column="3" Content="Szűrt sorok kijelölése" Command="{Binding SelectFilteredRowsCommand}" CommandParameter="{Binding ElementName=MyDataGrid}" />
因此,我将带有命令参数的数据网格发送到视图模型。
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 类型。