2015-07-09 2 views
1

В моем xaml я использовал wpf ContextMenu для отображения пунктов меню в datagid wpf. Мне нужно скрыть пункты меню на основе условия. Я попробовал следующее, но не работал.Как скрыть пункт меню контекстного меню в wpf xaml на основе условия

<ContextMenu x:Key="contextMenuTextCell"> 


      <MenuItem Name="copyDealContextMenu" 
        Header="Copy Deal" 
        Command="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.CopyDeal}" 
        CommandParameter="{Binding}"> 

       <Style TargetType="{x:Type MenuItem}"> 
        <Setter Property="Visibility" Value="Collapsed"></Setter> 
        <Style.Triggers> 
         <DataTrigger Binding="{ Binding ElementName= BlotGrid,Path=DataContext.ProductType }" Value="FXO"> 
          <Setter Property="Visibility" Value="Visible"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 

      </MenuItem> 

     </ContextMenu> 

Как скрыть пункты меню в контекстном меню?

Thanks

+0

Я предполагаю, что ваша команда связывания не работает также .. –

+0

Команда связывания работает нормально. Просто добавлен стиль для контроля видимости. – Tarun

ответ

2

Есть 2 причины, по которым это не сработало.

1) заключается в том, что ContextMenu не находится в том же VisualTree, что и элемент, для которого он установлен (т. Е. Это PlacementTarget). Там вы не сможете привязать элемент к ElementName.

2) вы ставите свой стиль, как будто это содержимое MenuItem. (Я тоже этого не заметил). он должен быть установлен в «Стиль» DependencyProperty вашего MenuItem.

<Grid x:Name="BlotGrid" Background="Red"> 
    <Grid.ContextMenu> 
     <ContextMenu>    
      <MenuItem Name="copyDealContextMenu" 
       Header="Copy Deal"   
       CommandParameter="{Binding}"> 
       <MenuItem.Style> 
        <Style TargetType="{x:Type MenuItem}"> 
         <Setter Property="Visibility" Value="Collapsed"></Setter> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu},Path=PlacementTarget.DataContext.IsXXX}" Value="True"> 
           <Setter Property="Visibility" Value="Visible"></Setter> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </MenuItem.Style> 
      </MenuItem> 
     </ContextMenu> 
    </Grid.ContextMenu>  
</Grid> 
+0

Привет, Eran, ContextMenu является частью Grid. ContextMenu появится на datagrid, щелкнув правой кнопкой мыши на строке. Пробовал приведенный выше код, способный видеть PlacementTarget.DataContext.ProductType в Xaml как ожидалось, но стиль datatrigger не запускается, так как я не могу видеть пункт меню – Tarun

+0

проверить свой код, я сделал это с свойством IsXXX. и Истинное значение. Вы изменили его, чтобы выполнить свой код потребности. кстати. я протестировал его перед отправкой ответа. Так что держите открытый ум и проверяйте себя. причины, которые я изложил, действительны. –

+0

Да, изменил код в соответствии с моей потребностью. Хорошо попробует. – Tarun

0

Иногда привязка не работает, потому что контекстное меню находится на другом визуальном дереве. так, альтернативный путь. Если вы хотите свернуть/отключить его, вы можете перейти к открытию контекстного меню этого события, вы нашли все элементы MenuItems и так, что хотите.

<Grid x:Name="BlotGrid" Background="Red"> 
    <Grid.ContextMenu> 
     <ContextMenu Opening="cmMediaItem_Opening"> 

      <MenuItem Name="copyDealContextMenu" 
       Header="Copy Deal"   
       CommandParameter="{Binding}"> 

      </MenuItem>  

     </ContextMenu> 
    </Grid.ContextMenu>  
</Grid> 

В xaml.cs,

private void cmMediaItem_Opening(object sender, RadRoutedEventArgs e) 
     { 
      var menu = sender as ContextMenu; 
      if(menu != null) 
       { 
       foreach (var item in menu.Items) 
       { 
        var radMenuItem = item as MenuItem; 
        if (radMenuItem.Name == "copyDealContextMenu") 
        { 
         //radMenuItem.IsEnabled = false; 
         //radMenuItem.Visibility = false; 
        } 
       } 
       } 
     } 
Смежные вопросы