xaml - 将 gridview 列绑定到复选框

xaml - bind gridview columns to a checbox

我正在使用 telerik radgridviews,我有一些列,只有当复选框是 checked.The 复选框在网格外部并且我想要 show/hide 的列在另一个网格内时,我才想显示.这是我尝试过的方法,但似乎不起作用:

<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>

更新 #2 所以我有以下内容,但它似乎不起作用。我没有遇到任何绑定问题,但选中或取消选中该复选框没有任何作用。

 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}}" />

试试这个(来源 here

<FrameworkElement x:Name="dummyElement"  Visibility="Collapsed"  />
<DataGrid .... >
    <DataGrid.Columns>
        <DataGridTextColumn Visibility="{Binding DataContext.IsChecked, 
                                                 Source={x:Reference dummyElement}, 
                                                 Converter={StaticResource BooleanToVisibilityConverter}}"  />
    </DataGrid.Columns>
</DataGrid>

将您的 Name="test" 更改为 x:Name="test"(差异 here

如果我对你的理解是正确的,你希望根据 checkbox 更改 GridViewDataColumn 的可见性,基本上有两种方法可以做到这一点:

  • 简单直接的方法是将列的 IsVisible 属性 绑定到 CheckBoxIsChecked 属性,使用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>
    
  • 另一种方法是将复选框的 IsChecked 依赖项 属性 和 GridViewDataColumnIsVisible 绑定到同一个 属性:

    <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));
        }
    

确保实现 INotifyPropertyChanged 接口并正确设置 DataContext.