选中或取消选中菜单项时隐藏/显示网格视图列
本文关键字:网格 显示 视图 取消 菜单项 隐藏 | 更新日期: 2024-10-18 21:23:56
我想在单击菜单项时隐藏网格视图列。
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:如何使用XAML隐藏GridViewColumn?
ViewModel:
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-to-visible转换器并实现其功能。非常感谢你的帮助。如果你有问题,请问我。谢谢大家。我尝试了插入和移除,而不是显示和隐藏,移除就像一个魅力,但插入每次都需要一个显示成员绑定来绑定到集合,这是显而易见的。我试过一个专栏,效果很好,我需要它为所有人服务。有什么想法吗?
我找到了一个解决方法。我有一个新函数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());
}