【问题标题】:Hide/show gridview column when a menu item is checked or unchecked选中或取消选中菜单项时隐藏/显示 gridview 列
【发布时间】:2015-03-06 15:55:02
【问题描述】:

我想在单击菜单项时隐藏网格视图列。

Xaml:

    <MenuItem Header="View">
                    <MenuItem Header="Columns" Name="menuView" ItemsSource="{Binding Path= MyMenuItems}">
                        <MenuItem.ItemContainerStyle>
                            <Style TargetType="{x:Type MenuItem}">
                                <Setter Property="Header" Value="{Binding Header}" />
                                <Setter Property="IsChecked" Value="{Binding IsChecked,Mode=TwoWay}"/>
                                <Setter Property="IsCheckable" Value="{Binding IsCheckable}"/>
                                <Setter Property="Icon" Value= "{Binding ImageIcon}"/>
                                <Setter Property="IsEnabled" Value= "{Binding Path =IsEnabled}"/>
                                <Setter Property="ItemsSource" Value="{Binding Path=  MyMenuItems}"/>
                                <Setter Property= "Command" Value= "{Binding DataContext.CheckedViewMenuItemsCmd, RelativeSource ={RelativeSource AncestorType={x:Type MenuItem}}}"/>
                                <Setter Property="CommandParameter" Value="{Binding}" />
                                <Setter Property="StaysOpenOnClick" Value="{Binding StaysOpenOnClick}"/>
                            </Style>                            </MenuItem.ItemContainerStyle>                          
                    </MenuItem>

    <ListView Name="MyListView" Grid.Row="1"  SelectedItem ="{Binding SelectedFeature}" ItemsSource="{Binding Path= MyListItems}">
                <ListView.View>
                    <GridView util:GridViewColumnClass.HeaderTextMember="HeaderText"
                              util:GridViewColumnClass.DisplayMemberMember="DisplayMember"
                              util:GridViewColumnClass.ColumnsSource=" {Binding Columns}"/>
   </ListView.View>

菜单项标题与网格视图列标题相同。选中或未选中菜单项时,我希望显示网格视图列或隐藏。

我确实有一个与这里类似的 GidViewColumnVisibilityManager 。 WPF: How to hide GridViewColumn using XAML?

视图模型:

    public MyViewModel()
    {
        MyListItems = SomeClass.instance.messages;
        _MenuItems = new ObservableCollection<MenuClass>();
        //populates the view menu
        PopulateViewMenu();

        this.Columns = new ObservableCollection<ColumnDescriptor>
        {

            new ColumnDescriptor{ Width = 40, HeaderText ="column1",  DisplayMember= "column1"},
            new ColumnDescriptor{ Width = 40, HeaderText="column2" ,  DisplayMember= "column2"},
            new ColumnDescriptor{ Width = 70, HeaderText="column3" , DisplayMember="column3"},

        };

        //event to command 
        CheckedViewMenuItemsCmd = new RelayCommand<MenuClass>(CheckedViewMenuItems);
    }
     public ObservableCollection<ColumnDescriptor> Columns { get; private set; }

    private ICommand _addColumnCommand;

    public ICommand AddColumnCommand
    {
        get
        {
            if (_addColumnCommand == null)
            {
                _addColumnCommand = new RelayCommand<string>(
                    s =>
                    {
                        this.Columns.Add(new ColumnDescriptor { HeaderText = s, DisplayMember = s });
                    });
            }
            return _addColumnCommand;
        }
    }

    private ICommand _removeColumnCommand;
    public ICommand RemoveColumnCommand
    {
        get
        {
            if (_removeColumnCommand == null)
            {
                _removeColumnCommand = new RelayCommand<string>(
                    s =>
                    {
                        this.Columns.Remove(this.Columns.FirstOrDefault(d => d.DisplayMember == s));
                    });
            }
            return _removeColumnCommand;
        }
    }
     private void CheckedViewMenuItems(MenuClass m)
    {
        try
        {
            bool IsChecked = m.IsChecked;
            if (IsChecked)
            {

                ColumnDescriptor cl1 =     new ColumnDescriptor{ Width = 40, HeaderText =m.Header,  DisplayMember= "Revision"};
                int idx = Convert.ToInt32(m.Tag);
                int insertidx = Math.Min(idx, this.Columns.Count);
                this.Columns.Insert(insertidx, cl1);
            }
            else
            {
                foreach (var item in this.Columns)
                {
                    if (item.HeaderText == m.Header)
                    {
                       // item.DisplayMember = "";
                        this.Columns.Remove(item);                            

                        break;
                    }

                }
            }


        }
        catch (Exception ex)
        {
            Debug.WriteLine(String.Format("{0}{1}{2}{1}{3}", ex.GetType().ToString(), Environment.NewLine, ex.Message, ex.StackTrace));

        }

    }

我对如何使用 booleon 到可见转换器并实现该功能感到有些困惑。感谢您的帮助。如果您有任何问题,请向我提问。谢谢各位。 我尝试插入和删除而不是显示和隐藏,删除就像一个魅力,但插入需要一个显示成员绑定来每次绑定到集合,这是显而易见的。我尝试了一个专栏,它工作正常,我需要它为所有人工作。有什么想法吗?

【问题讨论】:

  • 谢谢...是的,他们不应该有标签。对不起。

标签: c# wpf mvvm


【解决方案1】:

我找到了解决方法。我有一个新函数 GetdisplayMember,它返回一个字符串,具体取决于单击了哪个菜单项。这是解决方法。效果很好。干杯!

 private string GetDisplayMember(int tag)
    {
        string displayMember = string.Empty;
        if (tag != null)
        {
            switch (tag)
            {
                case 0:
                    displayMember = "Revision";
                    break;
                case 1:
                    displayMember = "Class";
                    break;
                case 2:
                    displayMember = "Errordate";
                    break;
         }

      }

        return displayMember;
    }

    private void CheckedViewMenuItems(MenuClass m)
    {
        try
        {    
            if (m!=null)
            {

                bool IsChecked = m.IsChecked;
                if (IsChecked)
                {                    
                   ColumnDescriptor cl1 =new   ColumnDescriptor     
                    {           

                       HeaderText =m.Header, 
                       DisplayMember= GetDisplayMember(m.Tag)
                     };
                       int idx = Convert.ToInt32(m.Tag);
                       int insertidx = Math.Min(idx,   
                       this.Columns.Count);
                       this.Columns.Insert(insertidx, cl1);
                }
                else
                {
                    foreach (var item in this.Columns)
                    {
                        if (item.HeaderText == m.Header)
                        {
                           // item.DisplayMember = "";
                            this.Columns.Remove(item);  
                            break;
                        }
                    }
                }            

            }              
        }
        catch (Exception ex)
        {
            Debug.WriteLine(String.Format("{0}{1}{2}{1}{3}", ex.GetType().ToString(), Environment.NewLine, ex.Message, ex.StackTrace));
            ErrorLogger.Log(LogLevel.Error, ex.ToString());
        }

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多