【问题标题】:WPF MVVM Dynamic SubMenu Binding IssueWPF MVVM 动态子菜单绑定问题
【发布时间】:2010-11-22 14:35:30
【问题描述】:

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

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

ObservableCollection<MenuItemViewModel>

每次列表视图中的数据更改时,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");
        }
    }

【问题讨论】:

    标签: wpf mvvm submenu


    【解决方案1】:

    我不必使用 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>
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 哦,如果您需要设置整个集合,我认为您需要在 View 后面的代码中处理 Children 属性的 PropertyChanged 通知以执行重新绑定。
      • 我从集合和子集合中删除了所有项目并重新添加了新的 MenuItemViewModel 对象,但我仍然得到相同的结果,第二次没有子菜单。
      • 这就像当属性发生变化时,它只看到顶层发生变化,而不是 subs/children。有什么方法可以强制它递归遍历所有集合?
      猜你喜欢
      • 2015-08-07
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      相关资源
      最近更新 更多