Articles in this section
Category / Section

How to change column order dynamically using column chooser in WPF DataGrid (SfDataGrid)?

3 mins read

The ColumnChooser allows you to add or remove columns dynamically from the current view of grid by drag-and-drop operations in WPF DataGrid (SfDataGrid). You can change the column order dynamically through column chooser by using the BaseCommand class as shown in the below code snippet,

C#:

public CustomColumnChooserViewModel(ObservableCollection<ColumnChooserItems> hiddenColumns, ObservableCollection<ColumnChooserItems> visibleColumns)
 {
     HiddenColumnCollection = hiddenColumns;
     VisibleColumnCollection = visibleColumns;
 }
 
 public ObservableCollection<ColumnChooserItems> HiddenColumnCollection
 {
     get;
     set;
 }
 
 public ObservableCollection<ColumnChooserItems> VisibleColumnCollection
 {
     get;
     set;
 }
 
 private BaseCommand _MoveRightCommand;
 public BaseCommand MoveRightCommand
 {
     get
     {
         if (_MoveRightCommand == null)
             _MoveRightCommand = new BaseCommand(MoveRight);
        return _MoveRightCommand;
     }
 }
 
 void MoveRight(object obj)
 {
     var listBoxes = (object[])obj;
     var hiddenListBox = listBoxes[0] as ListBox;
     var visibleListBox = listBoxes[1] as ListBox;
     if (hiddenListBox.SelectedItem != null)
     {
         var item = hiddenListBox.SelectedItem as ColumnChooserItems;
         var itemsSource = hiddenListBox.ItemsSource as ObservableCollection<ColumnChooserItems>;
         itemsSource.Remove(item);
         (visibleListBox.ItemsSource as ObservableCollection<ColumnChooserItems>).Add(item);
     }
 }
 
 private BaseCommand _MoveLeftCommand;
 public BaseCommand MoveLeftCommand
 {
     get
     {
         if (_MoveLeftCommand == null)
             _MoveLeftCommand = new BaseCommand(MoveLeft);
         return _MoveLeftCommand;
     }
 }
 
 void MoveLeft(object obj)
 {
     var listBoxes = (object[])obj;
     var hiddenListBox = listBoxes[0] as ListBox;
     var visibleListBox = listBoxes[1] as ListBox;
     if (visibleListBox.SelectedItem != null)
     {
         var item = visibleListBox.SelectedItem as ColumnChooserItems;
         var itemsSource = visibleListBox.ItemsSource as ObservableCollection<ColumnChooserItems>;
         itemsSource.Remove(item);
         (hiddenListBox.ItemsSource as ObservableCollection<ColumnChooserItems>).Add(item);
     }
 }
 
 private BaseCommand _MoveUpCommand;
 public BaseCommand MoveUpCommand
 {
     get
     {
         if (_MoveUpCommand == null)
             _MoveUpCommand = new BaseCommand(MoveUp);
         return _MoveUpCommand;
     }
 }
 
 void MoveUp(object obj)
 {
     var listBox = obj as ListBox;
     var itemsSource = listBox.ItemsSource as ObservableCollection<ColumnChooserItems>;
     var selectedIndex = listBox.SelectedIndex;
     if(listBox.SelectedItem != null)
         itemsSource.Move(selectedIndex, selectedIndex - 1);
 }
 
 private BaseCommand _MoveDownCommand;
 public BaseCommand MoveDownCommand
 {
     get
     {
         if (_MoveDownCommand == null)
             _MoveDownCommand = new BaseCommand(MoveDown);
         return _MoveDownCommand;
     }
 }
 
 
void MoveDown(object obj)
 {
     var listBox = obj as ListBox;
     var itemsSource = listBox.ItemsSource as ObservableCollection<ColumnChooserItems>;
     var selectedIndex = listBox.SelectedIndex;
     if(listBox.SelectedItem != null)
         itemsSource.Move(selectedIndex, selectedIndex + 1);
 }
 
 private BaseCommand _OkCommand;
 public BaseCommand OkCommand
 {
     get
     {
         if (_OkCommand == null)
             _OkCommand = new BaseCommand(OkayClick);
         return _OkCommand;
     }
 }
 
 void OkayClick(object obj)
 {
     var columnChooserWindow = obj as CustomColumnChooser;
     columnChooserWindow.DialogResult = true;
 }
 

 

XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="40" />
        <RowDefinition Height="*" />
        <RowDefinition Height="50" />
    </Grid.RowDefinitions>
 
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
 
    <Label Content="Hidden Columns" Height="24" Margin="3" FontWeight="Bold" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"/>
    <Label Content="Visible Columns" Height="24" Margin="3" FontWeight="Bold" Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="2"/>
    <ListBox x:Name="listBox1"
             Grid.Row="1"
             Grid.Column="0"
             Margin="0,5"
             HorizontalAlignment="Stretch"
             BorderThickness="0"
             ItemsSource="{Binding HiddenColumnCollection}">
        <ListBox.ItemTemplate>
            <StaticResource ResourceKey="MyDataTemplate" />
        </ListBox.ItemTemplate>
    </ListBox>
 
    <StackPanel Grid.Column="1" Grid.Row="1" Orientation="Vertical">
        <Button Content="Move Right" 
                Command="{Binding MoveRightCommand}" 
                Height="30" 
                Margin="5">
            <Button.CommandParameter>
                <MultiBinding Converter="{StaticResource multiConverter}">
                    <Binding ElementName="listBox1"/>
                    <Binding ElementName="listBox2"/>
                </MultiBinding>
            </Button.CommandParameter>
        </Button>
        <Button Content="Move Left" 
                Command="{Binding MoveLeftCommand}"  
                Height="30" 
                Margin="5">
            <Button.CommandParameter>
                <MultiBinding Converter="{StaticResource multiConverter}">
                    <Binding ElementName="listBox1"/>
                    <Binding ElementName="listBox2"/>
                </MultiBinding>
            </Button.CommandParameter>
        </Button>
    </StackPanel>
 
    <ListBox x:Name="listBox2" Grid.Row="1"
             Grid.Column="2"
             Margin="0,5"
             HorizontalAlignment="Stretch"
             BorderThickness="0"
             ItemsSource="{Binding VisibleColumnCollection}">
        <ListBox.ItemTemplate>
            <StaticResource ResourceKey="MyDataTemplate" />
        </ListBox.ItemTemplate>
    </ListBox>
 
    <StackPanel Grid.Column="3" Grid.Row="1" Orientation="Vertical">
        <Button Content="Move Up" 
                Command="{Binding MoveUpCommand}"
                CommandParameter="{Binding ElementName=listBox2}"
                Height="30" Margin="5"/>
        <Button Content="Move Down" 
                Command="{Binding MoveDownCommand}"
                CommandParameter="{Binding ElementName=listBox2}"
                Height="30" Margin="5"/>
    </StackPanel>
 
    <StackPanel Grid.Row="2" Margin="20,0,0,0" Grid.Column="2" Grid.ColumnSpan="2"
                VerticalAlignment="Stretch"
                Background="Transparent"
                Orientation="Horizontal">
        <Button Margin="5"
                    Command="{Binding OkCommand}"
                    CommandParameter="{Binding ElementName=ColumnChooserWindow}"
                    Content="OK" />
        <Button Margin="5"
                    Content="Cancel"
                    IsCancel="True"/>
    </StackPanel>
 
</Grid>

 

View Sample in GitHub

Did you find this information helpful?
Yes
No
Help us improve this page
Please provide feedback or comments
Comments (0)
Please  to leave a comment
Access denied
Access denied