XAML WPF -将CompositeCollection用作具有MenuItem上的变量类型的ItemSource时的绑定错误

rqqzpn5f  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(146)

简单地说,我有一个WPF MenuItem,其中包含最近打开的文件列表,它使用一个名为“RecentFilesViewModel”的类来填充文件并设置打开它们的命令。但是当我添加一个Seperator和一个最终手动添加的MenuItem时,问题就来了,它会清除最近打开的文件列表。
我的问题是,当使用CompositeCollection来设置ItemSource时,它可以很好地与自定义类提供的最近文件列表的CollectionContainer一起工作,但是一旦我包含Seperator或清除文件MenuItem,我就会遇到绑定问题。令人恼火的是,它实际上像预期的那样工作,没有问题,但我真的想知道为什么会显示绑定错误,并摆脱它们。
下面是我的MenuItem和它的CompositeCollection的XAML:

<MenuItem Header="_Recent files">
    <MenuItem.ItemsSource>
        <CompositeCollection>
            <CollectionContainer Collection="{Binding Source={StaticResource recentFilesViewModel}, Path=RecentFiles}" />
            <Separator Name="Seperator" />
            <MenuItem Name="ClearRecentFilesButton" Header="Clear recent files" Command="{x:Static local:ApplicationMenuHandler.File_RecentFiles_Clear}" />
        </CompositeCollection>
    </MenuItem.ItemsSource>
    <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Style.Triggers>
                <DataTrigger Value="{x:Null}">
                    <DataTrigger.Binding>
                        <PriorityBinding>
                            <Binding Path="Command"/>
                        </PriorityBinding>
                    </DataTrigger.Binding>
                    <Setter Property="Command" Value="{x:Static local:ApplicationMenuHandler.File_RecentFiles_Open}"/>
                    <Setter Property="CommandParameter" Value="{Binding FilePath}"/>
                    <Setter Property="Header" Value="{Binding FilePath}"/>
                    <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </MenuItem.ItemContainerStyle>
</MenuItem>

删除线路后:

<Separator Name="Seperator" />
<MenuItem Name="ClearRecentFilesButton" Header="Clear recent files" Command="{x:Static local:ApplicationMenuHandler.File_RecentFiles_Clear}" />

我根本没有得到任何绑定错误。那么是什么导致了这些错误呢?我会认为CompositeCollection正是允许这样的,一个变量类型的复合集合?
需要注意的事项包括:
1.当只向集合中添加Seperator时,绑定错误仅在单击其中一个包含的菜单项后显示。错误如下:
系统窗口数据错误:4:找不到引用为“RelativeSource FindAncestor,AncestorType ='System.Windows.Controls. ItemsControl',AncestorLevel ='1''. BindingExpression:Path=HorizontalContentAlignment;数据项=空;目标元素为“MenuItem”(Name ='');目标属性为“HorizontalContentAlignment”(类型为“HorizontalAlignment”)
1.当只添加额外的MenuItem时,应用程序加载时就会显示错误。但基本上是相同的错误:
系统窗口数据错误:4:找不到引用为“RelativeSource FindAncestor,AncestorType ='System.Windows.Controls. ItemsControl',AncestorLevel ='1''. BindingExpression:Path=HorizontalContentAlignment;数据项=空;目标元素为“MenuItem”(Name ='ClearRecentFilesButton');目标属性为“HorizontalContentAlignment”(类型为“HorizontalAlignment”)
我一直在绕圈子试图解决它,我想知道它是否与DataTrigger有关,但在尝试了许多不同的方法只针对具有“Command”属性的MenuItem之后,似乎没有什么改变任何事情,也许我误解了DataTrigger的工作原理,我真的希望我可以只使用后面的代码,因为这似乎是如此不必要的复杂,以实现如此简单的东西,如果它是代码,而不是XAML标记。
真的会感激任何帮助,我非常感谢任何帮助!提前谢谢你。

4nkexdtk

4nkexdtk1#

似乎是已知的问题,可以通过覆盖2个属性来解决...

<Style TargetType="MenuItem">
    <Setter Property="HorizontalContentAlignment" Value="Left"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>

如果你想挖得更深看。。
ContextMenu style produces weird Binding errors without using any Binding

相关问题