2016-11-30 69 views
0

我有一个数据网格显示SQL数据库表中存在的所有记录,我想添加一个按钮到我的用户界面,允许用户删除记录)他或她选择了。我发现的大多数参考文献都是围绕每行添加一个删除按钮或者涉及代码。我正在使用MVVM模式,我不想在每一行中都有一个按钮。目前,我可以一次删除一条记录,但需要有关如何遍历所选项目的帮助。我的代码如下:如何删除数据网格上的多个选定的行

XAML

  <Button x:Name="revokeBtn" 
       Grid.Row="0" 
       Grid.Column="4" 
       ToolTip="Revoke Selected License or Licenses" 
       Content="Revoke" 
       Command="{Binding RevokeSelectedCommand}" 
       CommandParameter="{Binding}"> 
     </Button> 

     <DataGrid x:Name="licenseGrid" 
        ItemsSource="{Binding LoggedUsers}" 
        SelectedItem="{Binding SelectedLicenses}" 
        Style="{DynamicResource DataGridStyle}" 
        Grid.Row="2" 
        Grid.Column="1" 
        Grid.ColumnSpan="6" 
        Height="535" 
        VerticalAlignment="Top" 
        IsReadOnly="True" 
        AutoGenerateColumns="False" 
        HeadersVisibility="Column" 
        SelectionMode="Extended" 
        CanUserDeleteRows="True" 
        EnableRowVirtualization="False"> 
      <DataGrid.RowStyle> 
       <Style TargetType="DataGridRow"> 
        <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
       </Style> 
      </DataGrid.RowStyle> 

与被绑定到表列DataGrid.Columns。

视图模型

public ObservableCollection<MD_LoggedUsersModel> LoggedUsers 
    { 
     get { return _loggedUsers; } 
     set { _loggedUsers = value; NotifyPropertyChanged(nameof(LoggedUsers)); } 
    } 

    public MD_LoggedUsersModel SelectedLicenses 
    { 
     get 
     { 
      return _selectedLicenses; 
     } 
     set 
     { 
      if (_selectedLicenses != value) 
      { 
       _selectedLicenses = value; 
       OnPropertyChanged(nameof(SelectedLicenses)); 
      } 
      if (_selectedLicenses == null) 
      { 
       LoadData(); 
      } 
     } 
    } 

    public bool IsSelected 
    { 
     get 
     { 
      return _isSelected; 
     } 
     set 
     { 
      if (_isSelected == value) return; 
      _isSelected = value; 
      OnPropertyChanged(nameof(IsSelected)); 
     } 
    } 

    public ICommand RevokeSelectedCommand 
    { 
     get 
     { 
      return _revokeSelectedCommand ?? (_revokeSelectedCommand = new CommandHandler(() => RevokeSelected(), _canExecute)); 
     } 
    } 
    private void RevokeSelected() 
    {need to iterate through selected rows here} 

什么是实现这一目标的最佳方式是什么?

+0

我一直处理选定行的方式是将一个CheckBox列添加到绑定到该类的IsSelected Property的网格中。然后你可以迭代你的集合,从DataSource中移除项目,并通知UI的变化 –

+0

如果能够选择多个行并点击Ctrl +鼠标,我不得不相信复选框不是必需的, d宁可不采取那条路线。 –

回答

0

由于缺乏对这篇文章的回应以及缺乏资源,我可以在这个问题上找到答案,我选择了正确工作的每一行中的按钮。

0

我已经有这个问题,一对夫妇一个月前的为此和我写了下面的附加属性:

public class MultiSelectorExtensions 
    { 
     public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.RegisterAttached(
      "SelectedItems", 
      typeof(INotifyCollectionChanged), 
      typeof(MultiSelectorExtensions), 
      new PropertyMetadata(default(INotifyCollectionChanged), OnSelectedItemsChanged)); 

     private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      MultiSelector multiSelectorControl = d as MultiSelector; 

      NotifyCollectionChangedEventHandler handler = (sender, args) => 
      { 
       if (multiSelectorControl != null) 
       { 
        IList listSelectedItems = multiSelectorControl.SelectedItems; 
        if (args.OldItems != null) 
        { 
         foreach (var item in args.OldItems) 
         { 
          if (listSelectedItems.Contains(item)) 
           listSelectedItems.Remove(item); 
         } 
        } 

        if (args.NewItems != null) 
        { 
         foreach (var item in args.NewItems) 
         { 
          if (!listSelectedItems.Contains(item)) 
           listSelectedItems.Add(item); 
         } 
        } 
       } 
      }; 

      if (e.OldValue == null && multiSelectorControl != null) 
      { 
       multiSelectorControl.SelectionChanged += OnSelectionChanged; 
      } 

      if (e.OldValue is INotifyCollectionChanged) 
      { 
       (e.OldValue as INotifyCollectionChanged).CollectionChanged -= handler; 
      } 

      if (e.NewValue is INotifyCollectionChanged) 
      { 
       (e.NewValue as INotifyCollectionChanged).CollectionChanged += handler; 
      } 

     } 

     private static void OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      DependencyObject d = sender as DependencyObject; 

      if (GetSelectionChangedInProgress(d)) 
       return; 

      SetSelectionChangedInProgress(d, true); 

      dynamic selectedItems = GetSelectedItems(d); 

      try 
      { 
       foreach (dynamic item in e.RemovedItems.Cast<dynamic>().Where(item => selectedItems.Contains(item))) 
       { 
        selectedItems.Remove(item); 
       } 
      } 
      catch (Exception) { } 

      try 
      { 
       foreach (dynamic item in e.AddedItems.Cast<dynamic>().Where(item => !selectedItems.Contains(item))) 
       { 
        selectedItems.Add(item); 
       } 
      } 
      catch (Exception){} 

      SetSelectionChangedInProgress(d, false); 
     } 

     public static void SetSelectedItems(DependencyObject element, INotifyCollectionChanged value) 
     { 
      element.SetValue(SelectedItemsProperty, value); 
     } 

     public static INotifyCollectionChanged GetSelectedItems(DependencyObject element) 
     { 
      return (INotifyCollectionChanged)element.GetValue(SelectedItemsProperty); 
     } 

     private static readonly DependencyProperty SelectionChangedInProgressProperty = DependencyProperty.RegisterAttached(
      "SelectionChangedInProgress", 
      typeof(bool), 
      typeof(MultiSelectorExtensions), 
      new PropertyMetadata(default(bool))); 

     private static void SetSelectionChangedInProgress(DependencyObject element, bool value) 
     { 
      element.SetValue(SelectionChangedInProgressProperty, value); 
     } 

     private static bool GetSelectionChangedInProgress(DependencyObject element) 
     { 
      return (bool)element.GetValue(SelectionChangedInProgressProperty); 
     } 
    } 

在视图您DataGrid你将不得不使用这种附加属性类似:

<DataGrid x:Name="licenseGrid" 
      ItemsSource="{Binding LoggedUsers}" 
      SelectedItem="{Binding SelectedLicenses}" 
      Style="{DynamicResource DataGridStyle}" 
      Grid.Row="2" 
      Grid.Column="1" 
      Grid.ColumnSpan="6" 
      Height="535" 
      VerticalAlignment="Top" 
      IsReadOnly="True" 
      AutoGenerateColumns="False" 
      HeadersVisibility="Column" 
      SelectionMode="Extended" 
      CanUserDeleteRows="True" 
      EnableRowVirtualization="False" 
      MyAttachedProperties:MultiSelectorExtensions.SelectedItems="{Binding SelectedLoggedUsers, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGrid> 

MyAttachedProperties是在MultiSelectorExtension类所在的命名空间。

并在您的视图模型,你再有它看起来像一个属性:

private ObservableCollection<MD_LoggedUsersModel> selectedLoggedUsers; 
public ObservableCollection<MD_LoggedUsersModel> SelectedLoggedUsers 
{ 
    get { return selectedLoggedUsers; } 
    set 
    { 
     selectedLoggedUsers = value; 
     NotifyPropertyChanged(nameof(SelectedLoggedUsers)); 
    } 
} 

重要提示:在您的视图模型的构造函数,你必须初始化SelectedLoggedUsers

SelectedLoggedUsers = new ObservableCollection<MD_LoggedUsersModel>(); 

否则酒店将为空并且附加属性不起作用。

相关问题