Search code examples
wpfxamltelerik

xaml - bind gridview columns to a checbox


I am using telerik radgridviews and I have some columns that I want to show only if a checkbox is checked.The checkbox is outside the grid and the columns I want to show/hide are inside another grid. This is what I have tried, but doesn't seem to work:

<Grid>
<Checkbox Name = "test">
</Grid>
<telerik:RadGridView ...>
     <telerik:RadGridView.Columns>
        <telerik:GridViewDataColumn>
         <telerik:GridViewDataColumn.CellTemplate>
             <DataTemplate>
                  <telerik:RadGridView ...                                
                    <telerik:RadGridView.Columns>
                       <telerik:GridViewDataColumn IsVisible="{Binding IsChecked,Source={x:Reference test}, Converter{StaticResource BooleanToVis}}" />                                                                                                                                
         </telerik:RadGridView.Columns>
                    </telerik:RadGridView>
              </DataTemplate>
             </telerik:GridViewDataColumn.CellTemplate>

Update #2 So I have the below, but it doesn't seem to work .I dont get any binding issues but checking or unchecking the checkbox doesnt do anything.

 public bool IsChecked
    {
        get
        {
            return isChecked;
        }
        set
        {
            if (isChecked != value)
            {
                isChecked = value;
                NotifyPropertyChanged(nameof(IsChecked));
            }
        }
    }

<BooleanToVisibilityConverter x:Key="BooleanToVis"/>         
<CheckBox x:Name="showCols" Content="test" IsChecked="{Binding IsChecked}"/>                                             
<telerik:GridViewDataColumn DataMemberBinding="{Binding x}" IsVisible="{Binding DataContext.IsChecked,Source={x:Reference showCols},Converter={StaticResource BooleanToVis}}" />

Solution

  • If i understood you correctly you are looking to change the visibility of a GridViewDataColumn based on a checkbox, there are basically two ways to do that:

    • The easy and straightforward way to do this is simply by binding the column's IsVisible property to the CheckBox's IsChecked porperty using elementname:

      <Grid>
          <Grid.RowDefinitions>
              <RowDefinition Height="auto"/>
              <RowDefinition Height="*"/>
          </Grid.RowDefinitions>
          <Grid Grid.Row="0">
              <CheckBox Name="ChkBox" />
          </Grid>
          <telerik:RadGridView  Grid.Row="1">
              <telerik:RadGridView.Columns>
                  <telerik:GridViewDataColumn IsVisible="{Binding Path=IsChecked, ElementName=ChkBox}"  Header="First Name" UniqueName="FirstName" />
                  <telerik:GridViewDataColumn  Header="Last Name" UniqueName="LasttName" />
              </telerik:RadGridView.Columns>
          </telerik:RadGridView>
      </Grid>
      
    • The other way is to bind both the IsChecked dependency property of the checkbox and the IsVisible of the GridViewDataColumn to the same property:

      <Grid>
          <Grid.RowDefinitions>
              <RowDefinition Height="auto"/>
              <RowDefinition Height="*"/>
          </Grid.RowDefinitions>
          <Grid Grid.Row="0">
              <CheckBox Name="ChkBox" IsChecked="{Binding IsCheckedP}"/>
          </Grid>
          <telerik:RadGridView  Grid.Row="1">
              <telerik:RadGridView.Columns>
                  <telerik:GridViewDataColumn IsVisible="{Binding IsCheckedP}"  Header="First Name" UniqueName="FirstName" />
                  <telerik:GridViewDataColumn  Header="Last Name" UniqueName="LasttName" />
              </telerik:RadGridView.Columns>
          </telerik:RadGridView>
      </Grid>
      
      
        private bool _isChecked;
          public bool IsCheckedP
          {
              get { return _isChecked; }
              set
              {
                  _isChecked = value;
                  OnPropertyChanged();
              }
          }
      
          public ViewModel()
          {
              //...
          }
      
          public event PropertyChangedEventHandler PropertyChanged;          
          protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
          {
              PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
          }
      

    Make sure to implement the INotifyPropertyChanged interface and to properly set the DataContext.