web-dev-qa-db-ja.com

C#/ WPF:GridViewColumnをVisible = falseにしますか?

このようにGridViewColumnを非表示にするオプションがあるかどうか誰かが知っていますか?

<ListView.View>
    <GridView>
        <GridViewColumn Header="Test" IsVisible="{Binding Path=ColumnIsVisible}" />
    </GridView>
<ListView.View>

どうもありがとう!

編集:明確にするために

残念ながら、「IsVisible」プロパティはありません。私はそれを作成する方法を探しています。

編集:フィードバックに基づくソリューションは次のようになります:

<GridViewColumn DisplayMemberBinding="{Binding Path=OptionColumn1Text}" 
                Width="{Binding Path=SelectedEntitiy.OptionColumn1Width}">
    <GridViewColumnHeader Content="{Binding Path=SelectedEntitiy.OptionColumn1Header}" IsEnabled="{Binding Path=SelectedEntitiy.OptionColumn1Width, Converter={StaticResource widthToBool}}" />
</GridViewColumn>

public class WidthToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value > 0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

ありがとうございます!
乾杯

編集:変更された質問を反映します。

幅0の列を作成するのはどうですか? ColumnIsVisibleをConverterParmeterとして使用するブール値を幅IValueConverterに記述しますか?

 public class BooleanToWidthConverter : IValueConverter {
        public object Convert(object value, Type targetType, 
                              object parameter, CultureInfo culture){
            return ((bool) parameter)? value : 0;
        }

        public object ConvertBack(object value, Type targetType, 
                                  object parameter, CultureInfo culture){
            throw new NotImplementedException();
        }
    }

何かのようなもの:

<ListView .. >
 <ListView.Resources>
  <BooleanToWidthConverter x:Key="boolToWidth" />
 </ListView.Resources>

 <ListView.View>
    <GridView>
        <GridViewColumn 
                  Header="Test" 
                  Width=
      "{Binding Path=ColumnWidth, 
                Converter={StaticResource boolToVis}, 
                ConverterParameter=ColumnIsVisible}" />
    </GridView>
 <ListView.View>
10
Preet Sangha

ここ は、列の幅をゼロに設定することに基づく別の解決策です。少し変更しました。これで、次のように機能します。

  1. Bool-to-visibilityコンバーターを使用して、ヘッダーの可視性をViewModelのブールプロパティにバインドします
  2. ヘッダーに添付されたプロパティを使用して、列の幅をゼロに設定します

これがコードです。

XAML:

<GridViewColumn
    HeaderTemplate="..." 
    HeaderContainerStyle="...">
    <GridViewColumnHeader 
        Content="Header text" 
        Visibility="{Binding AppliesToColumnVisible, Converter={StaticResource BooleanToVisibilityConverter}}" 
        behaviors:GridViewBehaviors.CollapseableColumn="True" />

BooleanToVisibilityConverter:

public class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool param = bool.Parse(value.ToString());
        if (param == true)
            return Visibility.Visible;
        else
            return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

アタッチされた動作GridViewBehaviors.CollapseableColumn:

public static readonly DependencyProperty CollapseableColumnProperty =
     DependencyProperty.RegisterAttached("CollapseableColumn", typeof(bool), typeof(GridViewBehaviors),
    new UIPropertyMetadata(false, OnCollapseableColumnChanged));

public static bool GetCollapseableColumn(DependencyObject d)
{
    return (bool)d.GetValue(CollapseableColumnProperty);
}

public static void SetCollapseableColumn(DependencyObject d, bool value)
{
    d.SetValue(CollapseableColumnProperty, value);
}

private static void OnCollapseableColumnChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
    GridViewColumnHeader header = sender as GridViewColumnHeader;
    if (header == null)
        return;

    header.IsVisibleChanged += new DependencyPropertyChangedEventHandler(AdjustWidth);
}

static void AdjustWidth(object sender, DependencyPropertyChangedEventArgs e)
{
    GridViewColumnHeader header = sender as GridViewColumnHeader;
    if (header == null)
        return;

    if (header.Visibility == Visibility.Collapsed)
        header.Column.Width = 0;
    else
        header.Column.Width = double.NaN;   // "Auto"
}
7
Helge Klein

列幅をゼロに設定するという概念を使用しているが、IValueConverterを使用する副作用がない(ユーザーは列をより広くドラッグできます)というより単純なアプローチの1つは、新しいゲッター/セッターを作成することですこれは、ColumnIsVisible変数に基づいて幅を返し、それにバインドします。

_public double ColumnWidth
{
    get
    {
        if (this.ColumnIsVisible)
        {
            return 100;
        }
        else
        {
            return 0;
        }
    }

    set
    {
        OnPropertyChanged("ColumnWidth");
    }
}
_

バインディングをTwoWayにして、ユーザーが列をより広くドラッグしようとすると、OnPropertyChangedが呼び出され、幅が0にリセットされます。ただし、バインディングにはバインディングプロキシを使用する必要がある場合があります。また、ColumnIsVisibleが更新されるたびに、OnPropertyChanged("ColumnWidth")への呼び出しを追加します:)

0
stuicidle

列のWidth = "0"をゼロに設定しました。これで、列は表示されないように見えます。しかし、それが他の何かに影響を与えるかどうかはわかりません。ダミーの解決策かもしれませんが、今のところは機能します。

0
hyphestos