引用 MahApps.Metro 时 ListView 自定义视图绑定错误

ListView custom view binding errors when MahApps.Metro referenced

我处理的应用程序是 WPF/.Net Core 3.1。它使用 ListView 和自定义 View(显示 WrapPanel 中的项目)。一切正常,直到我添加对 MahApps.Metro 的引用并在 App 中包含必要的 MahApps.Metro 资源。之后 ListView 功能中断,项目不再像 WrapPanel 中那样显示,就像普通列表一样... 此外,我在调试输出中收到以下错误:

System.Windows.Data Error: 40 : BindingExpression path error: 'Columns' property not found on 'object' ''TileView' (HashCode=8352109)'. BindingExpression:Path=TemplatedParent.View.Columns; DataItem='ScrollViewer' (Name=''); target element is 'ScrollViewer' (Name=''); target property is 'NoTarget' (type 'Object')
System.Windows.Data Error: 40 : BindingExpression path error: 'ColumnHeaderContainerStyle' property not found on 'object' ''TileView' (HashCode=8352109)'. BindingExpression:Path=TemplatedParent.View.ColumnHeaderContainerStyle; DataItem='ScrollViewer' (Name=''); target element is 'GridViewHeaderRowPresenter' (Name=''); target property is 'ColumnHeaderContainerStyle' (type 'Style')
System.Windows.Data Error: 40 : BindingExpression path error: 'ColumnHeaderTemplate' property not found on 'object' ''TileView' (HashCode=8352109)'. BindingExpression:Path=TemplatedParent.View.ColumnHeaderTemplate; DataItem='ScrollViewer' (Name=''); target element is 'GridViewHeaderRowPresenter' (Name=''); target property is 'ColumnHeaderTemplate' (type 'DataTemplate')
System.Windows.Data Error: 40 : BindingExpression path error: 'ColumnHeaderTemplateSelector' property not found on 'object' ''TileView' (HashCode=8352109)'. BindingExpression:Path=TemplatedParent.View.ColumnHeaderTemplateSelector; DataItem='ScrollViewer' (Name=''); target element is 'GridViewHeaderRowPresenter' (Name=''); target property is 'ColumnHeaderTemplateSelector' (type 'DataTemplateSelector')
System.Windows.Data Error: 40 : BindingExpression path error: 'ColumnHeaderStringFormat' property not found on 'object' ''TileView' (HashCode=8352109)'. BindingExpression:Path=TemplatedParent.View.ColumnHeaderStringFormat; DataItem='ScrollViewer' (Name=''); target element is 'GridViewHeaderRowPresenter' (Name=''); target property is 'ColumnHeaderStringFormat' (type 'String')
System.Windows.Data Error: 40 : BindingExpression path error: 'AllowsColumnReorder' property not found on 'object' ''TileView' (HashCode=8352109)'. BindingExpression:Path=TemplatedParent.View.AllowsColumnReorder; DataItem='ScrollViewer' (Name=''); target element is 'GridViewHeaderRowPresenter' (Name=''); target property is 'AllowsColumnReorder' (type 'Boolean')
System.Windows.Data Error: 40 : BindingExpression path error: 'ColumnHeaderContextMenu' property not found on 'object' ''TileView' (HashCode=8352109)'. BindingExpression:Path=TemplatedParent.View.ColumnHeaderContextMenu; DataItem='ScrollViewer' (Name=''); target element is 'GridViewHeaderRowPresenter' (Name=''); target property is 'ColumnHeaderContextMenu' (type 'ContextMenu')
System.Windows.Data Error: 40 : BindingExpression path error: 'ColumnHeaderToolTip' property not found on 'object' ''TileView' (HashCode=8352109)'. BindingExpression:Path=TemplatedParent.View.ColumnHeaderToolTip; DataItem='ScrollViewer' (Name=''); target element is 'GridViewHeaderRowPresenter' (Name=''); target property is 'ColumnHeaderToolTip' (type 'Object')
System.Windows.Data Error: 40 : BindingExpression path error: 'Columns' property not found on 'object' ''TileView' (HashCode=8352109)'. BindingExpression:Path=TemplatedParent.View.Columns; DataItem='ScrollViewer' (Name=''); target element is 'GridViewHeaderRowPresenter' (Name='PART_HeaderRowPresenter'); target property is 'Columns' (type 'GridViewColumnCollection')

视图资源在子文件夹 Themes 中的 Generic.xaml 文件中设置。我不明白为什么它会损坏以及为什么找不到这些属性。 这里也有两个例子。一个是没有 MahApps.Metro 参考。另一个是 MahApps.Metro 被引用并且 ListView 功能中断。

好的应用程序,没有 MahApps.Metro 并且在 WrapPanel 中显示正确的 ListView,没有错误:

WpfApp11-Ok.7z

带有 MahApps.Metro 的应用程序显示已损坏 ListView、错误且没有更多 WrapPanel

WpfApp11-MahappsEnabled.7z

以下两个申请供参考:

https://filebin.net/qooty5o674obw29h

绑定错误

调试时的绑定错误源自 ListView 的 MahApps 默认样式。如您在 MahApps.Styles.ListView style 中所见,控件模板包含一个 ScrollViewer references a style called MahApps.Styles.ScrollViewer.GridView. This style is specific to a GridView and contains bindings to all the properties that are not found at runtime in the GridViewHeaderRowPresenter.

换句话说,MahApps 中 ListView 的默认样式需要 GridView。为了解决这个问题,您必须创建自定义 MahApps.Styles.ListView 样式来支持您的 TileView.

包裹面板

WrapPanel 在您的应用程序中应用,但在使用 MahApps 时不应用。似乎实际上应用了 VirtualizingStackPanel。 MahApps default style for ListBox contains this Trigger:

<Trigger Property="VirtualizingStackPanel.IsVirtualizing" Value="True">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel IsItemsHost="True"
                                        IsVirtualizing="True"
                                        IsVirtualizingWhenGrouping="True"
                                        VirtualizationMode="Recycling" />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Trigger>

它会覆盖您在基于此 ListBox 样式的样式中设置的项目面板 (WrapPanel)。您可以将此触发器添加到原始应用程序中的样式以产生相同的结果。

有多个选项可以解决这个问题:

  • 创建基本样式的副本并删除或更改触发器。
  • 在您的样式中创建相同的触发器,但使用您的项目面板模板覆盖该值
  • 在您的样式中添加 setter,将 VirtualizingStackPanel.IsVirtualizing 属性 设置为 False

不幸的是,这些选项在 MahApps 应用程序中不起作用。目前我不知道它是否与其他样式有关或上面的GridView问题,但你可以尝试一下是否适合你。