【发布时间】:2011-08-08 00:28:24
【问题描述】:
我有一个 ListView,它的布局看起来像一个 Windows 资源管理器视图(图标 + 一些细节),绑定到 ViewModel 中某处的列表。
我的目标是能够随时在资源管理器视图或经典视图之间切换。
我可以直接在ListView.ItemsPanel 字段中定义一个ItemsPanelTemplate 来完成正确显示布局的工作。现在,我想在资源中定义它,这样我就可以在不同的视图中使用它,尤其是在一个控件中,用户应该可以在资源管理器视图或经典列表视图之间进行选择(默认呈现一个列表)
你是怎么做到的?我不能在我的ResourceDictionary 中定义任何ItemsPanelTemplate,如果我定义了DataTemplate,它是不兼容的(虽然我认为遵循纯逻辑,ItemsPanelTemplate 应该继承自DataTemplate,但它实际上并没有看起来像这样)。
实际列表的代码 sn-p:
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel
Width="{Binding (FrameworkElement.ActualWidth),
RelativeSource={RelativeSource
AncestorType=ScrollContentPresenter}}"
ItemWidth="{Binding (ListView.View).ItemWidth,
RelativeSource={RelativeSource AncestorType=ListView}}"
ItemHeight="{Binding (ListView.View).ItemHeight,
RelativeSource={RelativeSource AncestorType=ListView}}"
/>
<!--
MinWidth="{Binding ItemWidth, RelativeSource={RelativeSource Self}}"
-->
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel
Orientation="Horizontal"
Height="Auto"
Width="150" >
<Image
Source="{Binding Path=Appli.AppType, Converter={StaticResource TypeToIconConverter}}"
Margin="5"
Height="50"
Width="50" />
<StackPanel
VerticalAlignment="Center"
Width="90" >
<TextBlock
Text="{Binding Path=Appli.AppName}"
FontSize="13"
HorizontalAlignment="Left"
TextWrapping="WrapWithOverflow"
Margin="0,0,0,1" />
<TextBlock
Text="{Binding Path=Appli.AppType}"
FontSize="9"
HorizontalAlignment="Left"
Margin="0,0,0,1" />
</StackPanel>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
将ItemTemplate 保存在静态资源中很容易做到,但现在我对ItemsPanelTemplate 无能为力...
有什么想法吗?我正在使用 MVVM,所以我尽量不使用代码隐藏
【问题讨论】:
标签: wpf listview mvvm datatemplate itemspanel