2016-11-21 54 views
0

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

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

回答

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> 

注意在风格二传手在ItemsControl的Command属性s'ItemContainerStyle,我们引用Menu元素的DataContext属性的Property OpenFileCommand。这是一个元素绑定。如果您想了解更多信息,请点击this链接。

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

希望这会有所帮助!

+0

ItemSource绑定到一个ObservableCollection的字符串。我尝试了您推荐的解决方案,但函数调用仍未触发。 – Methalous

+0

@Methalous,好吧,我已经在一个全新的WPF应用程序中测试了我的自我,并且它运行良好。也许你确实有另一个问题。我与你分享我的项目,所以也许它会帮助你找到一些问题。继续克隆[this](https://github.com/ktamayop/WpfMenuSample)回购,在处理该命令的方法中设置一个断点,您将看到它被击中。 –

相关问题