1

我正在动态创建一个上下文菜单,并且菜单项有子项。第一次出现子菜单,但在第二次之后,只有父菜单显示。子子菜单位于绑定到它们只是不出现的上下文菜单的集合中。

VMMenuItems 是我的视图模型中的一个属性,是

ObservableCollection<MenuItemViewModel>

每次 Listview 中的数据更改时,VMMenuItems 都会完全重建。子菜单只是将另一个 MenuItemViewModel 添加到现有 MenuItemViewModel 的子项中。关于如何使子菜单每次都起作用的任何想法?

编码

<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");
        }
    }
4

2 回答 2

3

我不必使用 HierarchicalDataTemplate 并将其全部放在 ContextMenu.ItemContainerStyle 中。我不确定为什么我的其他方式不起作用(它第一次起作用,但没有其他任何方法)。也许其他人可以告诉我为什么它不起作用......

<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>
于 2010-11-25T11:48:53.407 回答
0

我自己对此还是很陌生,如果不对其进行测试或确切原因,我不确定,但我相信这与用全新的系列替换儿童系列有关。我认为这需要重新绑定集合。从现有集合中添加/删除项目会更好。这将触发适当的绑定通知。现在,绑定到该集合的特定实例,该实例在 Children.set 调用中被替换。希望这可以帮助。

于 2010-11-23T13:22:23.083 回答