Pergunta

Estou criando dinamicamente um menu de contexto e os itens do menu têm filhos. A primeira vez que o submenus aparece, mas no segundo e lá depois de apenas o show dos menus dos pais. O submenu da criança está na coleção que está vinculada ao menu de contexto que eles simplesmente não aparecem.

Vmmenuitems é uma propriedade no meu modelo de visualização e é

ObservableCollection<MenuItemViewModel>

Toda vez que os dados no ListView mudam o Vmmenuitems é totalmente reconstruído. Um sub -menu está apenas adicionando outro MenuitemViewModel aos filhos de um MenuitemviewModel existente. Alguma idéia de como fazer o submenus funcionar sempre?

O código

<Window.Resources>        
    <HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}"
                              ItemsSource="{Binding Path=Children}">
        <ContentPresenter Content="{Binding Path=MenuText}" />
    </HierarchicalDataTemplate>
</Window.Resources>

 <ListView.ContextMenu>
       <ContextMenu ItemsSource="{Binding Path=VMMenuItems>
          <ContextMenu.ItemContainerStyle>
              <Style TargetType="{x:Type MenuItem}">                                    
                 <Setter Property="Command" Value="{Binding Command}"/>
                  <Setter Property="CommandParameter" Value="{Binding MenuText}"/> 
                            </Style>
                        </ContextMenu.ItemContainerStyle>
                    </ContextMenu>                       
                </ListView.ContextMenu>

public class MenuItemViewModel : ViewModel
{  
    public MenuItemViewModel()
    {
        Children = new ObservableCollection<MenuItemViewModel>();
    }


    private string _menuText;
    public string MenuText
    {

        get { return _menuText; }

        set
        {
            _menuText = value;
            OnPropertyChanged("MenuText");
        }
    }


    private bool _isEnabled;
    public bool IsEnabled
    {
        get { return _isEnabled; }

        set
        {
            _isEnabled = value;
            OnPropertyChanged("IsEnabled");
        }
    }


    private ICommand _command;
    public ICommand Command
    {
        get { return _command; }

        set
        {
            _command = value;
            OnPropertyChanged("Command");
        }
    }

    private ObservableCollection<MenuItemViewModel> _children;
    public ObservableCollection<MenuItemViewModel> Children
    {
        get { return _children; }

        set
        {
            _children = value;
            OnPropertyChanged("Children");
        }
    }
Foi útil?

Solução

Eu não tive que não usar um relógio hierárquico e colocar tudo aqui no contextmenu.itemContainersTyle. Não sei por que minha outra maneira não funcionou (bem, funcionou na primeira vez, mas não outros). Talvez outra pessoa pudesse me dizer por que não funciona ...

<ContextMenu.ItemContainerStyle>
  <Style TargetType="{x:Type MenuItem}">
   <Setter Property="Header" Value="{Binding MenuText}"/>
   <Setter Property="ItemsSource" Value="{Binding Path=Children}"/>
   <Setter Property="Command" Value="{Binding Command}"/>
   <Setter Property="CommandParameter" Value="{Binding MenuText}"/>
  </Style>
 </ContextMenu.ItemContainerStyle>

Outras dicas

Ainda sou novo nisso e não sei ao certo sem testá -lo ou exatamente por que, mas acredito que isso tem a ver com a substituição da coleção Children por uma coleção totalmente nova. Eu acho que isso exigiria a reincidência da coleção. Seria melhor para os itens a serem adicionados/removidos da coleção existente. Isso desencadearia as notificações de ligação apropriadas. No momento, a ligação é a uma instância específica dessa coleção que está sendo substituída na chamada das crianças. Espero que isto ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top