【发布时间】:2014-08-24 01:57:24
【问题描述】:
我在 DataGrid 中有几列,我希望根据该列的复选框显示或隐藏它们。我事先进行了相当多的搜索,发现了许多不同的答案,但在每种情况下,它们要么不起作用,要么针对不同的情况。
如果我理解正确,ElementName 将无法工作,因为 Visual Tree 不可用。但是我尝试设置 Source 和 RelativeSource 没有任何运气。在其当前状态下,它简单地返回错误:未解析的引用“filterDuration”。该错误导致程序无法运行。
更新了以下建议和更多信息,但仍未解决
这是转换器:(它甚至从来没有进入过这个)
[ValueConversion(typeof(bool), typeof(Visibility))]
public class FilterVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool isSelected = System.Convert.ToBoolean(value);
return isSelected ? Visibility.Visible : Visibility.Hidden;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var v = (Visibility)value;
return v == Visibility.Hidden ? false : true;
}
}
这里是复选框:
<DataTemplate x:Key="Settings">
<DockPanel>
<GroupBox Header="Filter Columns" DockPanel.Dock="Right">
<ag:AutoGrid Columns="150, 150, 150" RowCount="7" RowHeight="20">
<CheckBox Content="Id" />
<CheckBox Content="Desc" />
<CheckBox x:Name="filterDuration" Content="Duration" />
</ag:AutoGrid>
</GroupBox>
</DockPanel>
</DataTemplate>
这是 DataGrid:(为简洁起见,删除了额外的列和属性)
<DockPanel Grid.Row="0" Grid.Column="0">
<Expander DockPanel.Dock="Top" Header="{x:Static p:Resources.shSettings}" ContentTemplate="{StaticResource Settings}" IsExpanded="True" />
<Border DockPanel.Dock="Top" Background="#FF595959">
<TextBlock Text="{x:Static p:Resources.shViolations}" Style="{StaticResource SectionHeaderText}" />
</Border>
<DataGrid IsReadOnly="True" ItemsSource="{Binding items}" SelectedItem="{Binding Path=selecteditem}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Header="Duration" Binding="{Binding Duration}" Visibility="{Binding Source={x:Reference filterDuration}, Path=IsChecked, Converter={StaticResource FilterVisibility}}" />
<DataGridTextColumn Header="CTG Id" Binding="{Binding Id}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
【问题讨论】:
-
在小样本中试用过,您的代码在我的最后工作正常。
-
CheckBox 本身位于 Expander 的 ContentTemplate 中,但 Expander 开始展开后可见。我认为这根本不重要,但我正在抓住稻草。