2011-08-10 27 views
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爲默認值。 順便說一句,如果任何人有一個更好的方式來處理這種東西,請讓我知道:)

+0

「OnIsVisibleChanged」中的代碼很難閱讀,拼寫出正確的名稱而不是單字母變量。 –

+0

我想你是對的,我只是想在我的例子中想要更少的文本。現在就修正它,只爲你:) – snurre

+0

如果你爲自己勾畫一些將被拋棄的東西,那麼更少的代碼就可以了,請別在別人需要閱讀並理解它的時候去做是與它的問題(即如果你在這裏發佈)。 –

回答

1

FallbackValue是當綁定無法返回一個值。因爲您在構造函數中將其設置爲true,所以列b會被檢查並可見。適當地更新你的構造函數。

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

另外,我想在列的可見性變化,因爲文本菜單也許不是‘創造’,直到單擊鼠標右鍵。嘗試一個正常的菜單,看看是否有效,是的。