首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态设置GridViewColumn宽度

动态设置GridViewColumn宽度
EN

Stack Overflow用户
提问于 2017-03-27 20:19:26
回答 2查看 985关注 0票数 0

在我的mvvm应用程序中,我有一个listview。我喜欢显示/隐藏列表视图中的一些列,这取决于复选框“”的状态(这里:应该显示/隐藏Col1 )。

这是我非常简化的代码。怎么啦?!很明显这不管用!

代码语言:javascript
复制
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="185">

  <Window.Resources>
    <local:ConverterHideListViewColumn x:Key="ConverterHideListViewColumn" />
  </Window.Resources>

  <Grid>
    <ListView Height="100" Width="100">
      <ListView.View>
        <GridView>
          <GridViewColumn Header="Col0" Width="40"/>
          <GridViewColumn Header="Col1" Width="{Binding ShowAllColumns, Converter={StaticResource ConverterHideListViewColumn}}"/>
        </GridView>
      </ListView.View>
    </ListView>

    <CheckBox 
      Content="Show all columns"
      IsChecked="{Binding ShowAllColumns, Mode=TwoWay}"
      Margin="40,140,0,0">
    </CheckBox>

  </Grid>
</Window>
代码语言:javascript
复制
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;

namespace WpfApplication1
{
  public partial class MainWindow : Window
  {
    VM _vm;

    public MainWindow ()
    {
      InitializeComponent ();
      _vm = new VM ();
      this.DataContext = _vm;
    }
  }

  /// <summary>
  /// Dummy Viewmodel
  /// </summary>
  public class VM : INotifyPropertyChanged
  {
    private bool _bShowAllColumns;
    public event PropertyChangedEventHandler PropertyChanged;

    public VM ()
    {
      ShowAllColumns = true;
    }

    public bool ShowAllColumns
    {
      get { return _bShowAllColumns; }
      set { _bShowAllColumns = value; }
    }

    private void OnPropertyChanged (string propertyName)
    {
      var handler = PropertyChanged;
      if (handler != null)
        handler (this, new PropertyChangedEventArgs (propertyName));
    }
  }


  /// <summary>
  /// Converter for setting the ListView-Column width, depending on value VM.ShowAllColumns
  /// </summary>
  class ConverterHideListViewColumn : IValueConverter
  {
    public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      bool   bShowAllColumns = false;
      double dWidth          = 0;

      if (value is bool)
      {
        bShowAllColumns = (bool) value;
        dWidth = bShowAllColumns? 40 : 0;
      }

      return dWidth;
    }

    public object ConvertBack (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      throw new NotSupportedException ();
    }
   }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-28 13:13:56

GridViewColumn不会添加到可视树中,也不会继承任何DataContext,因此,如果不使用BindingProxy类,则无法将其Width属性绑定到视图模型的源属性:https://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

票数 0
EN

Stack Overflow用户

发布于 2017-03-28 02:49:01

这就是你需要的..。

代码语言:javascript
复制
public bool ShowAllColumns
{
    get { return _bShowAllColumns; }
    set
    {
        if (_bShowAllColumns != value)
        {
            _bShowAllColumns = value;
            OnPropertyChanged("ShowAllColumns");
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43055736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档