Как уведомить ViewModel, когда свойства, связанные с ObservableCollection, изменяются? - PullRequest
0 голосов
/ 18 мая 2019

Я использую HierarchicalDataTemplate для создания меню, которое будет иметь элементы MenuItem, которые можно проверять.В моей ViewModel я создаю ObservableCollection класса с именем MenuItemModel, а затем связываю ObservableCollection в моем View.Я могу построить меню вместе с его подменю, но я не могу понять, как сказать ViewModel, какой MenuItem проверен.

Я пытался использовать INotifyPropertyChanged в MenuItemModel, но я не мог понять, какчтобы отправить эту информацию в ViewModel.После долгих поисков я пришел к выводу, что это неправильный подход, и мне нужно только использовать INotifyPropertyChanged во ViewModel.Я новичок в WPF, поэтому все еще учусь делать и не делать.Я нашел большую часть кода ниже в StackOverflow и сумел адаптировать его к своим потребностям, но я все еще пытаюсь понять, как он работает.Приведенный ниже код создаст меню «Главное меню» с 3 подменю «SubMenu1», «SubMenu2» и «SubMenu3», где все они доступны для проверки.При этом, вот мои вопросы:

  1. Как / где я могу реализовать событие OnPropertyChanged в ViewModel, когда MenuItem отмечен / не отмечен?
  2. Как я могу получить доступ к свойствам моделиMenuItem, который был отмечен / не отмечен?
            <Menu DockPanel.Dock="Top" ItemsSource="{Binding MenuItemsObservableCollection}">
                <Menu.ItemContainerStyle>
                    <Style TargetType="{x:Type MenuItem}">
                        <Setter Property="IsCheckable"  Value="{Binding IsCheckable}" />
                        <Setter Property="StaysOpenOnClick"  Value="{Binding IsCheckable}" />
                        <Setter Property="IsChecked"  Value="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                    </Style>
                </Menu.ItemContainerStyle>
                <Menu.ItemTemplate>
                    <HierarchicalDataTemplate DataType="{x:Type local:ViewModel}" ItemsSource="{Binding Path=SubMenuItemsObservableCollection}">
                        <TextBlock Text="{Binding Header}"/>
                    </HierarchicalDataTemplate>
                </Menu.ItemTemplate>
            </Menu>
    class ViewModel : INotifyPropertyChanged
    {
        public ViewModel()
        {
            AddMenuItems();
        }

        private void AddMenuItems()
        {
            var subMenu = new ObservableCollection<MenuItemModel>
            {
                new MenuItemModel { Header = "SubMenu1" },
                new MenuItemModel { Header = "SubMenu2"},
                new MenuItemModel { Header = "SubMenu3"}
            };            

            MenuItemsObservableCollection = new ObservableCollection<MenuItemModel>
            {
                new MenuItemModel { Header = "Main Menu", SubMenuItemsObservableCollection = subMenu }
            };
        }

        private void OnPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public ObservableCollection<MenuItemModel> MenuItemsObservableCollection { get; set; }



    }
class MenuItemModel
    {
        public MenuItemModel()
        {
        }

        public string Header { get; set; }
        public string Key { get; set; }
        public bool IsCheckable { get; set; } = true
        public bool IsChecked { get; set; } = false;

        public ObservableCollection<MenuItemModel> SubMenuItemsObservableCollection { get; set; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...