Я использую HierarchicalDataTemplate для создания меню, которое будет иметь элементы MenuItem, которые можно проверять.В моей ViewModel я создаю ObservableCollection класса с именем MenuItemModel, а затем связываю ObservableCollection в моем View.Я могу построить меню вместе с его подменю, но я не могу понять, как сказать ViewModel, какой MenuItem проверен.
Я пытался использовать INotifyPropertyChanged в MenuItemModel, но я не мог понять, какчтобы отправить эту информацию в ViewModel.После долгих поисков я пришел к выводу, что это неправильный подход, и мне нужно только использовать INotifyPropertyChanged во ViewModel.Я новичок в WPF, поэтому все еще учусь делать и не делать.Я нашел большую часть кода ниже в StackOverflow и сумел адаптировать его к своим потребностям, но я все еще пытаюсь понять, как он работает.Приведенный ниже код создаст меню «Главное меню» с 3 подменю «SubMenu1», «SubMenu2» и «SubMenu3», где все они доступны для проверки.При этом, вот мои вопросы:
- Как / где я могу реализовать событие OnPropertyChanged в ViewModel, когда MenuItem отмечен / не отмечен?
- Как я могу получить доступ к свойствам модели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; }
}