gpt4 book ai didi

c# - 通过 ContextMenu 显示/隐藏 GridViewColumns

转载 作者:太空宇宙 更新时间:2023-11-03 14:13:58 24 4
gpt4 key购买 nike

我有一个带有一些 GridViewColumns 的 ListView,我希望能够通过 ContextMenu 中的可检查项显示或隐藏它们。

MainView.xaml:

<ListView>
<ListView.ContextMenu>
<ContextMenu>
<MenuItem x:Name="cma" Header="a" IsCheckable="True" IsChecked="True"/>
<MenuItem x:Name="cmb" Header="b" IsCheckable="True"/>
<MenuItem x:Name="cmc" Header="c" IsCheckable="True" IsChecked="True"/>
<MenuItem x:Name="cmd" Header="d" IsCheckable="True"/>
</ContextMenu>
</ListView.ContextMenu>
<ListView.View>
<GridView>
<c:GridViewColumnExt c:GridViewColumnExt.IsVisible="{Binding ElementName=cma, Path=IsChecked}">
<GridViewColumnHeader Content="a"/>
</c:GridViewColumnExt>
<c:GridViewColumnExt c:GridViewColumnExt.IsVisible="{Binding ElementName=cmb, Path=IsChecked}">
<GridViewColumnHeader Content="b"/>
</c:GridViewColumnExt>
<c:GridViewColumnExt c:GridViewColumnExt.IsVisible="{Binding ElementName=cmc, Path=IsChecked}">
<GridViewColumnHeader Content="c"/>
</c:GridViewColumnExt>
<c:GridViewColumnExt c:GridViewColumnExt.IsVisible="{Binding ElementName=cmd, Path=IsChecked}">
<GridViewColumnHeader Content="d"/>
</c:GridViewColumnExt>
</GridView>
</ListView.View>
</ListView>

GridViewColumnExt.cs:

public class GridViewColumnExt : GridViewColumn
{
private double _visibleWidth = double.NaN;

public bool IsVisible
{
get { return (bool)GetValue(IsVisibleProperty); }
set { SetValue(IsVisibleProperty, value); }
}

public static readonly DependencyProperty IsVisibleProperty = DependencyProperty.Register("IsVisible", typeof(bool), typeof(GridViewColumnExt), new FrameworkPropertyMetadata(true, OnIsVisibleChanged));

private static void OnIsVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var newValue = bool.Parse(e.NewValue.ToString());
var column = (GridViewColumnExt)d;
var header = (GridViewColumnHeader)column.Header;
header.IsEnabled = newValue;
if (newValue)
{
column.Width = column._visibleWidth;
header.IsEnabled = true;
header.Visibility = Visibility.Visible;
}
else
{
column._visibleWidth = column.Width;
column.Width = 0;
header.IsEnabled = false;
header.Visibility = Visibility.Collapsed;
}
}
}

MainViewModel.cs (没关系,解决方案不需要这个)

问题:

  • 当窗口首次显示时,a 和 c 列可见
  • 当第一次显示 ContextMenu 时,a 列和 c 列被隐藏,只显示 b 列。此外,在 ContextMenu 中仅选中 b 列

有人知道是什么原因造成的吗?


解决方案:

删除了对 ViewModel 属性的绑定(bind),并将 MenuItem.IsChecked 设置为默认值。顺便说一句,如果有人有更好的方法来处理这类事情,请告诉我:)

最佳答案

FallbackValue适用于绑定(bind)无法返回值的情况。列 b 已选中并且可见,因为您在构造函数中将其设置为 true。适本地更新您的构造函数。

public class MainViewModel
{
public MainViewModel()
{
ColumnChecked_a = true;
ColumnChecked_b = true;
ColumnChecked_c = true;
}
}

此外,我认为列的可见性会发生变化,因为上下文菜单可能在右键单击之前不会“创建”。尝试使用普通菜单,看看是否可行,是的。

关于c# - 通过 ContextMenu 显示/隐藏 GridViewColumns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7018471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com