菜单项xaml Mvvm中的最近文件实现

时间:2016-11-21 19:38:55

标签: c# xaml mvvm prism

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

    <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>

1 个答案:

答案 0 :(得分:0)

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

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

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

为菜单控件命名,例如:

<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中的Command属性的Setter样式&#39; ItemContainerStyle,我们引用Menu元素的DataContext属性的Property OpenFileCommand。这是一个元素绑定。如果您想了解更多信息,请查看this链接。

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

希望这有帮助!