引用 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
以下两个申请供参考:
绑定错误
调试时的绑定错误源自 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
问题,但你可以尝试一下是否适合你。
我处理的应用程序是 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
以下两个申请供参考:
绑定错误
调试时的绑定错误源自 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
问题,但你可以尝试一下是否适合你。