2
我有一個ListView和一些GridViewColumns,我希望能夠通過ContextMenu中的可選項顯示或隱藏它們。通過ContextMenu顯示/隱藏GridViewColumns
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是可見
- 當首次示出的文本菜單,列a和c變爲隱藏,僅列b被示出。此外,只有列b檢查在ContextMenu
有誰知道是什麼原因造成的?
解決方案:
刪除綁定到視圖模型的屬性和公正設定MenuItem.IsChecked爲默認值。 順便說一句,如果任何人有一個更好的方式來處理這種東西,請讓我知道:)
「OnIsVisibleChanged」中的代碼很難閱讀,拼寫出正確的名稱而不是單字母變量。 –
我想你是對的,我只是想在我的例子中想要更少的文本。現在就修正它,只爲你:) – snurre
如果你爲自己勾畫一些將被拋棄的東西,那麼更少的代碼就可以了,請別在別人需要閱讀並理解它的時候去做是與它的問題(即如果你在這裏發佈)。 –