奇怪的XAML错误:'“System.Windows.StaticResourceExtension”无法应用'

5
我有以下XAML代码,可以提供类似于VS2012“文件”>“最近文档”菜单的最近文档菜单:
<MenuItem Header="_FILE">
    ...
    <MenuItem Header="_Recent Studies" 
              ItemsSource="{Binding RecentFiles}" 
              AlternationCount="{Binding RecentFiles.Count}" 
              HeaderTemplate="{x:Null}">
        <MenuItem.Resources>
            <Style TargetType="{x:Type MenuItem}" 
                   BasedOn="{StaticResource {x:Type MenuItem}}">
                <Setter Property="HeaderTemplate" >
                   <Setter.Value>
                      <DataTemplate>
                         <TextBlock>
                            <TextBlock.Text>
                               <MultiBinding StringFormat="{}{0}. {1}">
                                  <Binding Path="(ItemsControl.AlternationIndex)" 
                                           RelativeSource="{RelativeSource FindAncestor, 
                                                                           AncestorType={x:Type MenuItem}}"/>
                                  <Binding Path="FullFileName"/>
                               </MultiBinding>
                            </TextBlock.Text>
                         </TextBlock>
                      </DataTemplate>
                   </Setter.Value>
                </Setter>
            </Style>
        </MenuItem.Resources>
    </MenuItem>
    <Separator/>
        <MenuItem Header="E_xit" 
                  Height="22"
                  Icon="{Binding Source={StaticResource Close}, 
                                 Converter={StaticResource drawingBrushToImageConverter}}"
                  Command="{Binding ExitCommand}" />
</MenuItem>

这个方法可以奏效!然而,所有与文件 MenuItem 块相关的XAML都被突出显示,并且我收到一个编译时错误(代码运行并成功了!),内容是:

不能将 "System.Windows.StaticResourceExtension" 类型的对象应用于 "System.Windows.Style" 类型的属性。

我使用的是.NET4.5和VS2012。为什么会发生这种情况?我该如何解决呢?

感谢您的时间。


你尝试过清理和重新构建解决方案,甚至重启VS吗?我无法在VS2013、VS2012、VS2010中复制这个错误。 - sa_ddam213
是的,我明白了。你提到使用“ResourceDictionary”引用项目本身,我不确定这怎么可能实现,但我认为这可能会解决问题? - MoonKnight
我如何将 MenuItem.Resources 移动到资源字典中,而不影响绑定到 RecentFiles 对象的能力? - MoonKnight
啊,是的,我正在使用 MahAppsMetro 资源库,其中有一个我正在使用的 MenuItem 重载/模板... 我会更改基于属性并查看是否有帮助。 - MoonKnight
我已经将 MenuItem.Resources 的代码移动到父级 <MenuItem> 中,这样可以消除错误,但是我失去了对 RecentFiles 的绑定。我将尝试基于此方法... - MoonKnight
显示剩余2条评论
1个回答

2

尝试像这样做

您应该能够将 Style 移动到任何 ResourceDictionary 中,它仍然可以工作,您只需使用 ItemContainerStyle 将其应用于 MenuItem 内部的项目即可。

<Window.Resources>
    <Style x:Key="MyMenuStyle" TargetType="{x:Type MenuItem}" >
        <Setter Property="HeaderTemplate" >
            <Setter.Value>
                <DataTemplate>
                    <TextBlock>
                        <TextBlock.Text>
                            <MultiBinding StringFormat="{}{0}. {1}">
                                <Binding Path="(ItemsControl.AlternationIndex)" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type MenuItem}}"/>
                                <Binding Path="FullFileName"/>
                            </MultiBinding>
                        </TextBlock.Text>
                    </TextBlock>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid>
    <Menu VerticalAlignment="Top">
        <MenuItem Header="_FILE" >
            <MenuItem Header="_Recent Studies" 
                      ItemsSource="{Binding RecentFiles}"
                      AlternationCount="{Binding RecentFiles.Count}"
                      ItemContainerStyle="{StaticResource MyMenuStyle}" />
            <Separator/>
            <MenuItem Header="E_xit" Height="22" Command="{Binding ExitCommand}" />
        </MenuItem>
    </Menu>

</Grid>

太好了。错误已经消失,但我的下拉最近列表的基本地铁样式现在不起作用,我的转换器也是如此。再次抱歉打扰你,我会尽快提供一些声望... 再次感谢... - MoonKnight
糟糕,我删掉了转换器和BasedOn,如果你把它们加回去,应该就可以工作了。 - sa_ddam213
抱歉,我甚至没有看过。对此感到遗憾 - 又是愚蠢的错误! - MoonKnight
太棒了!查看编辑后的美妙结果!再次感谢您,您提供了巨大的帮助,你和 @Marc 真正帮助我解决了 WPF 和 MVVM 的难题,所以非常感谢你们(不过我显然还有很长的路要走!)。 - MoonKnight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接