【问题标题】:Menu item recent files implementation in xaml Mvvmxaml Mvvm 中的菜单项最近文件实现
【发布时间】:2016-11-21 19:38:54
【问题描述】:

我正在尝试在文件菜单下实现标准的“最近的文件”选项。下面的代码正确显示了选项列表,但是当单击包含文件名的子菜单时,与命令的绑定不起作用。

    <MenuItem Header="File">
        <MenuItem Header="New File..." Command="{Binding NewFileCommand}" />
        <MenuItem Header="Open File..." Command="{Binding OpenFileCommand}" />
        <MenuItem Header="Recent Files"
             ItemsSource="{Binding Path=RaptManager.RaptConfiguration.RecentFiles}"
             Command="{Binding OpenFileCommand}">
         <ItemsControl.ItemContainerStyle>
              <Style TargetType="MenuItem">
                    <Setter Property="Header" Value="{Binding}"/>
                    <Setter Property="Command" Value="{Binding OpenFileCommand}"/>
              </Style>
          </ItemsControl.ItemContainerStyle> 
     </MenuItem>
</MenuItem>

【问题讨论】:

    标签: c# xaml mvvm prism


    【解决方案1】:

    我不知道您用来表示最近文件的对象是什么类型。我假设您使用的是字符串,尽管您也可能使用任何其他类型。

    您收到此错误是因为绑定框架正在您用来表示最近文件的类型上查找名为 OpenFileCommand 的属性,而不是在视图模型中。

    所以解决方案是使用元素绑定,以便直接绑定到视图模型中引用视图的 DataContext 的命令:

    例如为 Menu 控件命名:

    <MenuItem x:Name="Menu" Header="File">
    </Menu>
    

    现在您可以将元素绑定到菜单的 DataContext:

    <MenuItem Header="Recent Files"
            ItemsSource="{Binding Path=RaptManager.RaptConfiguration.RecentFiles}"
            Command="{Binding OpenFileCommand}">
        <ItemsControl.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="Header" Value="{Binding}" />
                <Setter Property="Command" Value="{Binding ElementName=Menu, Path=DataContext.OpenFileCommand}" />
            </Style>
        </ItemsControl.ItemContainerStyle>
    </MenuItem>
    

    请注意,在 ItemsControls 的 ItemContainerStyle 中 Command 属性的样式 Setter 中,我们引用了 Menu 元素的 DataContext 属性的 Property OpenFileCommand。那是元素绑定。如果您想了解更多信息,请查看this 链接。

    这样,您应该能够将视图命令正确绑定到视图模型中的 Command 属性。

    希望这会有所帮助!

    【讨论】:

    • ItemSource 绑定到字符串的 ObservableCollection。我尝试了您推荐的解决方案,但仍然没有触发函数调用。
    • @Methalous,好吧,我已经在一个全新的 WPF 应用程序中自己测试了它,它运行良好。也许你还有另一个问题。我正在与您分享我的项目,所以也许它会帮助您找到一些问题。继续克隆this repo,在处理命令的方法中设置一个断点,你会看到它被命中了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-06
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多