2013-08-16 4 views
1

Я новичок в мире wpf. У меня есть контекстное меню в оболочке, как показано ниже:mvvm с призмой: установка вида из пункта меню

   <ContextMenu> 

       <MenuItem Header="Login" 
          Command="{Binding WorkSpaceViewSetter}" CommandParameter="DemoApplication.View.LoginView"> 

        <MenuItem.Icon> 
         <Image Height="16" Width="16" Stretch="Uniform" Source="/Images/login.png"/> 
        </MenuItem.Icon> 

       </MenuItem> 

       <MenuItem Header="Modules" ItemsSource="{Binding AppModules}"> 

        <MenuItem.Icon> 
         <Image Source="/Images/modules.png"/> 
        </MenuItem.Icon> 

        <MenuItem.ItemContainerStyle> 
         <Style TargetType="MenuItem"> 
          <Setter Property="Header" Value="{Binding ModuleName}"/> 
          <Setter Property="Command" Value="{Binding ElementName=win, Path=DataContext.WorkSpaceViewFromType}"/> 
          <Setter Property="CommandParameter" Value="{Binding MainViewType}"/>      
         </Style> 
        </MenuItem.ItemContainerStyle> 

       </MenuItem> 

      </ContextMenu> 

Каждый элемент в ItemsSource AppModules из модулей MenuItem имеет свойство с именем MainViewType типа System.Type. Я хочу изменить вид региона, когда щелкнут элемент меню, и я думаю об использовании одного ICommad в shellviewmodel и передачи в качестве параметра команды MainViewType. Однако приведенный выше код не работает. Мне было интересно, почему тогда Modules menuitem заселяется из itemssource, как и ожидалось.

Я заметил, что команда связывания на Login MenuItem тоже не работает, даже если он должен иметь, так как itemssource свойство Modules получает правильно ограничена. Кто-нибудь может предложить, как заставить его работать?

+0

Как выглядит выполнение Execute ICommand? –

+0

Я использую DelegateCommand от Microsoft.Practices.Prism.Commands. –

ответ

0

Контекстные меню не находятся в одном и том же визуальном дереве, как и остальная часть вашего окна, поэтому использование ElementName в привязке не будет работать. Вместо этого вам нужно будет использовать PlacementTarget. Не зная, как структурированы ваши модели просмотра, трудно дать окончательный ответ, но ваше решение будет выглядеть примерно так:

<MenuItem.ItemContainerStyle> 
    <Style TargetType="MenuItem"> 
     <Setter Property="Header" Value="{Binding ModuleName}"/> 
     <Setter Property="Command" Value="{Binding PlacementTarget.DataContext.WorkSpaceViewFromType}"/> 
     <Setter Property="CommandParameter" Value="{Binding MainViewType}"/>      
    </Style> 
</MenuItem.ItemContainerStyle>