Проблема привязки динамического подменю WPF MVVM - PullRequest
1 голос
/ 22 ноября 2010

Я динамически создаю контекстное меню, и у пунктов меню есть дети.В первый раз вокруг появляются подменю, но во второй и после них показываются только родительские меню.Дочерние подменю находятся в коллекции, которая связана с контекстным меню, которое они просто не отображаются.

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

Ответы [ 2 ]

2 голосов
/ 25 ноября 2010

Мне пришлось не использовать 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>
0 голосов
/ 23 ноября 2010

Я все еще новичок в этом, и я не знаю наверняка, не протестировав это и не объяснив почему, но я верю, что это связано с заменой коллекции Children на совершенно новую коллекцию. Я думаю, что это потребует повторного связывания коллекции. Было бы лучше, если бы элементы были добавлены / удалены из существующей коллекции. Это вызовет соответствующие уведомления о привязке. Прямо сейчас, привязка к конкретному экземпляру этой коллекции, которая заменяется при вызове Children.set. Надеюсь, это поможет.

...