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
属性 绑定到 CheckBox
的 IsChecked
属性,使用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
依赖项 属性 和 GridViewDataColumn
的 IsVisible
绑定到同一个 属性:
<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
.
我正在使用 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
属性 绑定到CheckBox
的IsChecked
属性,使用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
依赖项 属性 和GridViewDataColumn
的IsVisible
绑定到同一个 属性:<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
.