我正在尝试使用允许用户显示/隐藏列的控件来构建DataGrid。我的DataGrid将有40个列,并不是所有的都可能是必需的。我已经能够使用一个使用GridView的ListView做这件事。 这是代码:
<DataGrid Name="MyDataGrid" Grid.Row="2" Grid.Column="0" ItemsSource="{Binding ReportOrderingCustomersForSalesRepCollection}" Style="{DynamicResource styleDataGrid}" HeadersVisibility="All" AutoGenerateColumns="False" RowHeaderWidth="0" RowHeight="25">
<DataGrid.Columns>
<DataGridTextColumn Header="Customer #" Binding="{Binding CustomerNumber}" Width="90" Visibility="{Binding ElementName=Visibility_Txt,Path=Text,Mode=OneWay}"/>
<DataGridTextColumn Header="Customer Name" Binding="{Binding CustomerName}" Width="125" />
<DataGridTemplateColumn Header="Email" CellTemplate="{StaticResource Email}" Width="150" />
</DataGrid.Columns>
</DataGrid>
<!-- text box -->
<TextBox Name="Visiblility_Txt">
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ColumnVisibilityCheck,Path=IsChecked}" Value="False">
<Setter Property="Text" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=ColumnVisibilityCheck,Path=IsChecked}" Value="True">
<Setter Property="Text" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<!-- checkbox -->
<CheckBox Content="Show/Hide Customer Number" Name="ColumnVisibilityCheck" IsChecked="True" />
所以我有一个DataGrid设置。第一个DataGridTextColumn上的Visibility属性设置为对“Visibility_Txt”的text属性的绑定。根据是否选中ColumnVisibilityCheck,该文本框上的文本将设置为折叠或可见。
就像我说的,这适用于listview,为什么这不适用于DataGrid?
答案 0 :(得分:1)
能够找到更多相关信息。这个链接有一个很好的答案/解释。 datagridtextcolumn-visibility-binding
事实证明,DataGrid的列不会出现在DataGrid的可视树中。
但答案是在可见性绑定中使用x:reference,以及BooleanToVisibilityConverter:
<DataGridTextColumn Header="Customer #" x:Name="CustNum_Col" Visibility="{Binding Source={x:Reference VisibilityCheck}, Path=IsChecked,Converter={StaticResource ObjectToVisibilityConverter}}" />
Visual Studio将显示绑定下的波浪线,表示“对象未设置为对象的实例”,但它仍然可以正常工作。
答案 1 :(得分:1)
只需将其MaxWidth属性设置为零,它就不会出现。
DataGrid.Columns[IndexOfColumn].MaxWidth = 0;
答案 2 :(得分:0)
1:在DataGrid中应用以下行为
<i:Interaction.Behaviors>
<b:DataGridColumnVisibilityBindingBehavior Binding="{Binding IsNameVisible}"
ColumnIndex="3" />
</i:Interaction.Behaviors>
3:这是行为的实施
public class DataGridColumnVisibilityBindingBehavior : Behavior<DataGrid>
{
private static readonly DependencyProperty ProxyProperty = DependencyProperty.RegisterAttached(
"Proxy",
typeof(object),
typeof(DataGridColumnVisibilityBindingBehavior),
new PropertyMetadata(OnGridProxyChanged));
private static readonly DependencyProperty AssociatedBinderProperty = DependencyProperty.RegisterAttached(
"AssociatedBinder",
typeof(ColumnDataContextBinder),
typeof(DataGridColumnVisibilityBindingBehavior),
new PropertyMetadata(default(ColumnDataContextBinder)));
public Binding Binding { get; set; }
public int ColumnIndex { get; set; }
protected override void OnAttached()
{
base.OnAttached();
CheckProxyBound();
var column = AssociatedObject.Columns[this.ColumnIndex];
var columnBinder = new ColumnDataContextBinder(column, this.Binding)
{
DataContext = AssociatedObject.GetValue(ProxyProperty)
};
column.SetValue(AssociatedBinderProperty, columnBinder);
}
private static void OnGridProxyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var grid = (DataGrid)d;
foreach (var column in grid.Columns)
{
var binder = (ColumnBinder)column.GetValue(AssociatedBinderProperty);
if (binder != null)
{
binder.DataContext = e.NewValue;
}
}
}
private void CheckProxyBound()
{
if (AssociatedObject.GetBindingExpression(ProxyProperty) == null)
{
AssociatedObject.SetBinding(ProxyProperty, new Binding());
}
}
private sealed class ColumnDataContextBinder : FrameworkElement
{
private static readonly DependencyProperty IsVisibleProperty = DependencyProperty.Register(
"IsVisible",
typeof(bool),
typeof(ColumnDataContextBinder),
new PropertyMetadata(true, (s, e) => ((ColumnDataContextBinder)s).OnVisibilityChanged()));
private readonly DataGridColumn column;
public ColumnDataContextBinder(DataGridColumn column, Binding binding)
{
column = column;
SetBinding(IsVisibleProperty, binding);
}
private bool IsVisible
{
get { return (bool)GetValue(IsVisibleProperty); }
}
private void OnVisibilityChanged()
{
column.Visibility = IsVisible ? Visibility.Visible : Visibility.Collapsed;
}
}
}
3:我希望这能回答你的问题。
答案 3 :(得分:0)
如果您正在自动生成列(或可以更改为该列),请尝试与此操作关联的事件。也可用于更改标题值。