【问题标题】:xaml - bind gridview columns to a checboxxaml - 将 gridview 列绑定到复选框
【发布时间】:2018-02-07 10:39:17
【问题描述】:

我正在使用 Telerik radgridviews,并且我有一些列,只有在选中复选框时才显示。复选框在网格之外,而我想要显示/隐藏的列在另一个网格内。这是我尝试过的,但似乎不起作用:

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

【问题讨论】:

  • CheckBox 上的绑定需要是 TwoWay:IsChecked="{Binding IsChecked, Mode=TwoWay}"
  • @Shawn 谢谢,但它仍然无法正常工作,不确定这是否与 Telerik 或其他什么有关..

标签: wpf xaml telerik


【解决方案1】:

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

  • 简单直接的方法是使用elementname 将列的IsVisible 属性绑定到CheckBoxIsChecked 属性:

    <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

【讨论】:

    【解决方案2】:

    试试这个(来源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

    【讨论】:

    • 不熟悉FrameworkElement..我还需要复选框吗?
    • @user1855165 当然,你可以用你的复选框代替它
    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2021-10-17
    • 2018-01-03
    • 2014-04-10
    相关资源
    最近更新 更多