سؤال

هل يعرف أي شخص ما إذا كان هناك خيار لإخفاء GridViewColumn بطريقة ما مثل هذا:

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

شكرًا جزيلاً!

تحرير: للتوضيح

لسوء الحظ ، لا يوجد خاصية "غير مرئية". أنا أبحث عن طريقة لإنشاء ذلك.

تحرير: يبدو الحل بناءً على التعليقات:

<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؟ اكتب منطقية إلى عرض altivalueConverter ، الذي يأخذ عمودًا مرئيًا مثل TrangterTerParmeter؟

 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>

نصائح أخرى

هنا هو حل آخر يعتمد على ضبط عرض العمود على الصفر. لقد قمت بتعديله قليلاً. يعمل الآن مثل هذا:

  1. ربط رؤية الرأس بخاصية منطقية من ViewModel ، باستخدام محول منسوب إلى وضوح
  2. استخدم خاصية مرفقة على الرأس لتعيين عرض العمود على الصفر

هنا هو الرمز.

XAML:

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

BooleantovibilityConverter:

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();
    }
}

السلوك المرفق GridViewBebehaviors.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"
}

لقد قمت بتعيين العمود العرض = "0" إلى الصفر. الآن يبدو العمود وكأنه غير مرئي. لكنني لا أعرف ما إذا كان سيؤثر على أي شيء آخر. قد يكون حلاً وهمية ولكنه يعمل الآن.

نهج واحد أبسط ، لا يزال يستخدم مفهوم ضبط عرض الأعمدة على الصفر ولكن ليس له آثار جانبية لاستخدام أ IValueConverter (لا يزال بإمكان المستخدم سحب العمود أوسع) هو إنشاء getter/setter جديد يعيد عرضًا بناءً على ColumnIsVisible متغير ثم اربط ذلك:

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

    set
    {
        OnPropertyChanged("ColumnWidth");
    }
}

اجعل روابطك twoway وإذا حاول المستخدم سحب العمود على نطاق أوسع OnPropertyChanged سيتم استدعاؤها وإعادة ضبط العرض إلى 0. قد تضطر إلى استخدام وكيل ربط على الرغم من الربط الخاص بك. أضف أيضًا مكالمة إلى OnPropertyChanged("ColumnWidth") عندما يتم تحديث ColumnIsvisible :)

استخدم إذا thumb.dragdelta قد يحل المشكلة

أستخدمه في ListView AS

<ListView x:Name="MyListView"IsSynchronizedWithCurrentItem="True"   
      ItemsSource="{Binding Path=Items}",  Mode=Default, Source={StaticResource DataProvider}}" 
      Thumb.DragDelta="Thumb_DragDelta">


public Window1()
{   
InitializeComponent(); 
MyListView.AddHandler(Thumb.DragDeltaEvent, new DragDeltaEventHandler(Thumb_DragDelta), true );

void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
{  
 Thumb senderAsThumb = e.OriginalSource as Thumb;    
 GridViewColumnHeader header = senderAsThumb.TemplatedParent as GridViewColumnHeader;     
 if (header.Column.ActualWidth < MIN_WIDTH)   
 {   
    header.Column.Width = MIN_WIDTH;  
 }  
 if (header.Column.ActualWidth > MAX_WIDTH)     
 {      
    header.Column.Width = MAX_WIDTH;   
 }
}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top