MenuItem Click 事件仅在修改其自己的 ItemsSource 时触发一次

问题描述

我想了解为什么 MenuItem 上的 Click 事件仅触发一次,如果您将项目添加到 ItemsSource。

但是如果您通过另一个控件(即按钮)添加项目,那么 Click 事件会继续触发吗?

    <StackPanel>
        <Menu HorizontalAlignment="Left" Height="100" Width="100">
            <MenuItem Header="MenuItem" Click="MenuItem_Click" ItemsSource="{Binding MyItems}" Height="100" Width="100">
            </MenuItem>
        </Menu>
    </StackPanel>
public partial class MainWindow : Window
{
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new Myviewmodel();
        }

        private void MenuItem_Click(object sender,RoutedEventArgs e)
        {
            ((Myviewmodel)DataContext).AddNewItem(null);
        }
}
public class Myviewmodel
{
        public ObservableCollection<string> MyItems { get; set; } = new ObservableCollection<string>();

        public Myviewmodel() { }

        public void AddNewItem(object x)
        {
            MyItems.Add(Guid.NewGuid().ToString());
        }
}

解决方法

当有子项要显示时,会捕获 ClickMenuItem 事件。

如果您点击添加的没有子项的 MenuItem,您的事件处理程序将再次被调用。

您可以处理另一个事件,例如 PreviewMouseLeftButtonDown 来解决这个“问题”。