none
WPF Datagrid masquer une ligne entière sur l'évenement "SelectionChanged" RRS feed

Toutes les réponses

  • Bonjour,

    on peux utiliser la propriete CurrentItem du DataGrid en question et le supprimer de la collection Items, autrement on peux supprimer l'Item en question de la collection qu'on a sur le ViewModel de notre View, pour le premier cas j'ai tester le code snippet suivant et ca marche :

    private void SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var dataGrid = ((DataGrid)sender);
        dataGrid.Items.Remove(dataGrid.CurrentItem);
    }

    pour le deuxieme cas de figure considerant le ViewModel suivant:

    public class MainWindowViewModel : INotifyPropertyChanged
    {
        public MainWindowViewModel()
        {
            GridViewCollection = new ObservableCollection<object>() {
                new { Name="test1", PhoneNumber="0661106654"},
                new { Name="test2", PhoneNumber="0661106654"},
                new { Name="test3", PhoneNumber="0661106654"},
                new { Name="test4", PhoneNumber="0661106654"},
            };
    
            GridCollectionSelectionChanged = new DelegateCommand((i) => {
                    GridViewCollection.Remove(i);
                });
        }
    
        public ObservableCollection<object> GridViewCollection { get; set; }
        public ICommand GridCollectionSelectionChanged { get; private set; }
    
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged([CallerMemberName]string propertyName = "")
        {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    avec la classe DelegateCommand implementant ICommand :

    public class DelegateCommand : ICommand
    {
        private Action<object> _action;
        public DelegateCommand(Action<object> action)
        {
            _action = action;
        }
    
        public event EventHandler CanExecuteChanged;
    
        public bool CanExecute(object parameter)
        {
            return true;
        }
    
        public void Execute(object parameter)
        {
            _action.Invoke(parameter);
        }
    }

    aussi pour lier les event aux command il faut utiliser l'assembly Interactivity d'Expression blend:

    et puis le XAML de notre MainWindow, on ajoute les liaisons entre datagrid interactions et les commands de notre ViewModel:

    <Window
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:DatagridExtended"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    
            xmlns:System="clr-namespace:System;assembly=mscorlib" x:Class="DatagridExtended.MainWindow"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Window.DataContext>
            <local:MainWindowViewModel/>
        </Window.DataContext>
        <Grid>
            <DataGrid x:Name="dataGrid" ItemsSource="{Binding GridViewCollection}" AutoGenerateColumns="True" SelectedCellsChanged="SelectedCellsChanged">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="SelectionChanged">
                        <i:InvokeCommandAction 
                            Command="{Binding GridCollectionSelectionChanged}" 
                            CommandParameter="{Binding CurrentItem, ElementName=dataGrid}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </DataGrid>
        </Grid>
    </Window>

    Good Coding;



    jeudi 18 octobre 2018 17:09