質問

私は、データバインドされたオブジェクトの一部properyを使用して/コンテキストメニューでshowメニューアイテムを非表示にするwan't。 しかし、私のメニューアイテムを非表示にしていない、彼らの可視性がVisibility.Hidden(それが本当にあるとしてVisibility.Collapsedない)に設定されますかのように、彼らが振る舞う、そのような行動の理由は何ですか?

ここでは一例です。

XAMLます:

<Window x:Class="MenuTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="converter"/>
        <DataTemplate x:Key="template">            
            <MenuItem Visibility="{Binding Visible, Converter={StaticResource converter}}" Header="{Binding Title}" />
        </DataTemplate>
        <ContextMenu x:Key="menu" ItemTemplate="{StaticResource template}"/>                    
    </Window.Resources>
    <Grid>
        <Button VerticalAlignment="Center" HorizontalAlignment="Center" Click="OnClick">Button</Button>
    </Grid>
</Window>

そして背後にあるコード:

public partial class Window1 : Window
    {
        public ObservableCollection<Item> list = new ObservableCollection<Item>();
        public Window1()
        {
            InitializeComponent();
            list.Add(new Item() { Title = "First", Visible = true }); ;
            list.Add(new Item() { Title = "Second", Visible = false }); ;
            list.Add(new Item() { Title = "Third", Visible = false }); ;
            list.Add(new Item() { Title = "Fourth", Visible = true }); ;
        }

        private void OnClick(object sender, RoutedEventArgs e)
        {
            ContextMenu cm =  FindResource("menu") as ContextMenu;
            cm.PlacementTarget = e.OriginalSource as UIElement;
            cm.Placement = System.Windows.Controls.Primitives.PlacementMode.Left;
            cm.ItemsSource = list;
            cm.IsOpen = true;
        }
    }

    public class Item
    {
        public string Title { get; set; }
        public bool Visible { get; set; }
    }

結果は、(ヘッダ内の任意の目に見えるテキストせず途中でが、2つの)4つの項目を有するメニューである。

役に立ちましたか?

解決

ContextMenuのItemTemplateには、あなたのバインドされたアイテムのそれぞれに適用されますので、

この動作は、の中にをMenuItemには、そのアイテムの作成。あなたのDataTemplateにメニューアイテムを置くことによって、あなたは、ネストされたメニューアイテムを作成します。外側の1がまだ表示されているので、あなたは、内側の1を折りたたむ場合であっても、そのためのスペースが残っている。

あなたのDataTemplateの中に入れ子になったMenuItemを取り除くとのTextBlockに置き換える取得、および可視性を設定したMenuItemに適用されるスタイルを使用することによってこの問題を解決することができます:

<Window x:Class="MenuTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="converter"/>
        <DataTemplate x:Key="template">
            <TextBlock Text="{Binding Title}"/>
        </DataTemplate>
        <ContextMenu x:Key="menu" ItemTemplate="{StaticResource template}">
            <ContextMenu.Resources>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Visibility" Value="{Binding Visible, Converter={StaticResource converter}}"/>
                </Style>
            </ContextMenu.Resources>
        </ContextMenu>
    </Window.Resources>
    <Grid>
        <Button HorizontalAlignment="Center" VerticalAlignment="Center" Click="OnClick">Button</Button>
    </Grid>
</Window>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top