32 Stimmen

WPF: Wie man GridViewColumn mit XAML ausblenden?

Ich habe das folgende Objekt in App.xaml

<Application.Resources>
        <ResourceDictionary>
            <GridView x:Key="myGridView" x:Shared="false">
                             <GridViewColumn Header="Created" DisplayMemberBinding="{Binding Path=Created}"/>

... more code ...

Und ich verwende diese Gitteransicht an mehreren Stellen. Beispiel:

<ListView x:Name="detailList"   View="{StaticResource myGridView}" ...>

In einer der Verwendungen (wie detailList oben), möchte ich die Spalte Erstellt ausblenden, möglicherweise mit XAML?

Irgendwelche Ideen?

1voto

ariso Punkte 1413

Dies ist mein Code, es funktioniert sehr gut in meinem Projekt. wenn Sie nicht möchten, um einige externe Code hinzufügen.

    /// <summary>
    /// show/hide datagrid column
    /// </summary>
    /// <param name="datagrid"></param>
    /// <param name="header"></param>
    private void ToggleDataGridColumnsVisible()
    {
        if (IsNeedToShowHideColumn())
        {
            foreach (GridViewColumn column in ((GridView)(this.ListView1.View)).Columns)
            {
                GridViewColumnHeader header = column.Header as GridViewColumnHeader;
                if (header != null)
                {
                    string headerstring = header.Tag.ToString();

                    if (!IsAllWaysShowingHeader(headerstring ) )
                    {
                        if (IsShowingHeader())
                        {

                        }
                        else
                        {
                            //hide it
                            header.Template = null;
                            column.CellTemplate = null;
                            column.Width = 0;
                        }
                    }
                }

            }

        }
    }

0voto

Ben Reierson Punkte 1079

Ich würde vorschlagen, mit einer benutzerdefinierten Eigenschaft (oder Hijacking eine vorhandene) auf der übergeordneten und dann mit einem benutzerdefinierten Stil auf der gridviewcolumnheader, dass Vorfahr-Eigenschaft zu verweisen. Wie dies:

<Window.Resources>
    <Style TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Visibility" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=Tag}"/>
    </Style>
    <GridView x:Key="myGridView" x:Shared="false">                             
        <GridViewColumn Header="Created" DisplayMemberBinding="{Binding Path=Created}"/>    
    </GridView>
</Window.Resources>
<Grid x:Name="LayoutRoot">
    <StackPanel>
        <ListView x:Name="detailList"   View="{StaticResource myGridView}"/>
        <ListView x:Name="detailListHide" Tag="{x:Static Member=Visibility.Hidden}" View="{StaticResource myGridView}"/>
    </StackPanel>
</Grid>

0voto

Timores Punkte 14206

In einem kleinen Dienstprogramm schrieb ich Ich habe eine Listenansicht, in der der Benutzer einige Spalten aus- und einblenden kann. Es gibt keine Sichtbarkeit-Eigenschaft auf die Spalten, so dass ich beschlossen, die versteckten Spalten Breite auf Null gesetzt. Nicht ideal, da der Benutzer immer noch ihre Größe ändern und sie wieder sichtbar machen kann.

Wie auch immer, ich habe dazu Folgendes verwendet:

<GridViewColumn.Width>
    <MultiBinding Converter="{StaticResource WidthConverter}" Mode="TwoWay">
        <Binding Path="ThreadIdColumnWidth" Mode="TwoWay" />
        <Binding Path="IsThreadIdShown" />
    </MultiBinding>
</GridViewColumn.Width>

IsThreadIdShown ist an ein Kontrollkästchen in der Symbolleiste gebunden. Und der Mehrwertkonverter ist:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
    if (values.Length != 2) {
        return null;
    }

    object o0 = values[0];
    object o1 = values[1];

    if (! (o1 is bool)) {
        return o0;
    }
    bool toBeDisplayed = (bool) o1;
    if (! toBeDisplayed) {
        return 0.0;
    }

    if (! (o0 is double)) {
        return 0;
    }

    return (double) o0;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) {

    return new object[] { (double)value, Binding.DoNothing };
}

0voto

paparazzo Punkte 43491

Das funktioniert bei mir
Sie müssen die Sichtbarkeit sowohl für die Kopfzeile als auch für den Inhalt binden.
In diesem Fall ist es am Ende, so dass ich mir keine Sorgen um die Breite mache.
ABER der Benutzer erhält keinen UI-Hook, um die Breite zurückzusetzen, wenn Sie also die Breite auf Null setzen, ist sie weg

<GridViewColumn Width="60">
    <GridViewColumnHeader HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch"
                            Visibility="{Binding Source={x:Static Application.Current}, Path=MyGabeLib.CurUser.IsInRoleSysAdmin, Converter={StaticResource bvc}}">
        <TextBlock>WS<LineBreak/>Count</TextBlock>
    </GridViewColumnHeader>
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=WordScoreCount, StringFormat={}{0:N0}}" HorizontalAlignment="Right"
                        Visibility="{Binding Source={x:Static Application.Current}, Path=MyGabeLib.CurUser.IsInRoleSysAdmin, Converter={StaticResource bvc}}"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

0voto

Luke Le Punkte 648
<GridViewColumn Width="{Binding Tag, RelativeSource={RelativeSource AncestorType=ListView}, Converter={converters:BooleanToWidthConverter}, ConverterParameter=100}">
                            <GridViewColumn.HeaderContainerStyle>
                                <Style TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource ColumnHeaderStyle}">
                                    <Setter Property="IsEnabled" Value="False"/>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource AncestorType=ListView}}" Value="true">
                                            <Setter Property="IsEnabled" Value="True"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </GridViewColumn.HeaderContainerStyle>
                            <GridViewColumn.Header>
                                <StackPanel Tag="columnHeader" Orientation="Horizontal">
                                </StackPanel>
                            </GridViewColumn.Header>
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <ContentControl>
                                        <TextBlock Text="test" />
                                    </ContentControl>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>

class BooleanToWidthConverter :I {

    public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool b)
        {
            return b ? parameter : 0;
        }
        return 0;
    }

    public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

Leider gibt es keine "IsVisible" Eigenschaft in GridViewColumn Aber, ich habe eine Lösung kann dieses Problem durch einfache und vollständige Weise zu lösen:

  1. Breite auf 0 setzen. Viele Dev hören bei diesem Schritt einfach auf, weil sie scheinbar ausgeblendet wurden, aber nicht. Wir machen es immer noch erweiterbar daher bringen es zurück auf der UI von Resize Spalte, so müssen wir mehr Schritt 2 zu tun.
  2. Deaktivieren Sie die Größenänderung der GridViewColumn, indem Sie GridViewColumnHeader IsEnabled = false setzen.

Codebeispiel oben:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X