Search code examples
c#wpfcheckboxdatagridselected

Getting whole row value if checkbox is checked in datagrid C#


I'm trying to write a code for getting 3 values from textboxes if some of checkboxes in same row is checked. Anyone know an easy(or hard) way to do this?

My datagrid looks like this: enter image description here

I have Load button that finds a file of specific type(XML.config) somewhere in file system, after that I'm calling a method that gets some strings from that file, find substrings of them and put them in 3 separated lists. Those values are in datagrid as Type, MapTo and Name. I accomplish this by putting all 3 lists in one ObservableCollection and after that I'm sending that ObservalableCollection to datagrid like this:

ObservableCollection<Tuple<string, string, string>> _obsCollection = new   ObservableCollection<Tuple<string, string, string>>();
public ObservableCollection<Tuple<string, string, string>> MyObsCollection
{
    get { return _obsCollection; }
}
tabela.ItemsSource = _obsCollection;

This is XAML code that shows binding:

<DataGrid Grid.Column="0" AutoGenerateColumns="False" Height="206" HorizontalAlignment="Left" Margin="12,265,0,0" Name="tabela" VerticalAlignment="Top" Width="556" SelectionChanged="tabela_SelectionChanged" Grid.RowSpan="2" ItemsSource="Binding MyObsCollection">
            <DataGrid.Columns>

                <DataGridTextColumn Header="Type" Width="122" Binding="{Binding Item1}"/>
                <DataGridTextColumn Header="MapTo" Width="122" Binding="{Binding Item2}"/>
                <DataGridTextColumn Header="Name" Width="121" Binding="{Binding Item3}"/>

                <DataGridTemplateColumn Header="Controller">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding DataGridChecked}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn Header="Service">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding DataGridChecked}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn Header="Injection">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding DataGridChecked}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

            </DataGrid.Columns>

        </DataGrid>

What I'm practically trying to is to accomplish looping thou all 3 columns containing checkboxes to see which of them are selected and if any of 3 in same row is selected then I need to send all 3 string values from that row to some variable. Anyone can help me with this. For instance I don't know how to get isSelected property from checkbox in data grid. I was doing a lot of researching and all that I was able to find was examples for DataGridView, and almost nothing for DataGrid.


Solution

  • Instead of using Tuple create your own class, say RowData with all the properties you want to show as columns:

    public class RowData: INotifyPropertyChanged
    {
        //implement INotifyPropertyChanged
    
        public string Type { get; set; }
        public string MapTo { get; set; }
        public string Name { get; set; }
        public bool Controller { get; set; }
        public bool Service { get; set; }
        public bool Injection { get; set; }
    }
    

    change ObservableCollection to use your type

    public ObservableCollection<RowData> MyObsCollection { get { .... } }
    

    and set AutoGenerateColumns="True" on DataGrid

    <DataGrid 
       Grid.Column="0" 
       Grid.RowSpan="2" 
       AutoGenerateColumns="True" 
       Height="206" 
       Width="556" 
       HorizontalAlignment="Left" 
       Margin="12,265,0,0" 
       Name="tabela" 
       VerticalAlignment="Top" 
       SelectionChanged="tabela_SelectionChanged" 
       ItemsSource="{Binding MyObsCollection}"/>
    

    and then to get items where any of 3 CheckBoxes is selected you do:

    var selectedList = MyObsCollection.Where(n => n.Controller || n.Service || n.Injection).ToList();