我制作了2张Listviews 1,带有图片+名称& lastname和1只显示图像(在列表视图的Wrap面板中)。第一个:
<ListView x:Name="lsvsomething" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" GotFocus="lsv_GotFocus" SelectionChanged="lsv_selectionchanged" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.View>
<GridView>
<GridViewColumn Width="auto">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image HorizontalAlignment="Center" VerticalAlignment="Center" Width="50" Height="50" Source="{Binding image}" Stretch="Fill"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="auto" DisplayMemberBinding="{Binding name}">
<GridViewColumnHeader Content="name" Tag="name" Click="SortClick"/>
</GridViewColumn>
<GridViewColumn Width="auto" DisplayMemberBinding="{Binding lastname}">
<GridViewColumnHeader Content="lastname" Tag="lastname" Click="SortClick" />
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
第二个(仅图像):
<ListView x:Name="lsvsomething" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" GotFocus="lsv_GotFocus" SelectionChanged="lsv_selectionchanged" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.View>
<GridView>
<GridViewColumn Width="60">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image HorizontalAlignment="Center" VerticalAlignment="Center" Width="50" Height="50" Source="{Binding image}" Stretch="Fill"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
现在他们都有ListView.View,我想将它们放在“模板”中?在app.xaml,但我不知道我怎么能这样做。第二个Listview也使用ItemsPanelTemplate使其成为一个包装panne。我发现如何在app.xaml中保存那个(ItemsPanel =“{DynamicResource somename}”)但是我在mutliple windows上使用这个listview所以我想在应用程序中保存它们(将它们的模板都制作?)。 xaml文件。然后我也应该能够在运行时切换它们。 (itemsource在“codebehind”中设置)
答案 0 :(得分:1)
“模板”确实不是确切的定义。我假设您真的想要对列表视图进行某种可重用性。选项很少
选项1 (首选)将每个ListView放入UserControl中。这将是一个独立的XAML文件,&lt; UserControl&gt;根元素和&lt; ListView&gt;它唯一的孩子(不需要面板,因为你只有一个元素.XAML看起来像:
<UserControl x:Class="SO.NameAndImageList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
>
<ListView ...>
...
</ListView>
</UserControl>
要使用此UserControl,请将“local”命名空间定义为指向您的代码,并将其放入:
<Window ...
xmlns:local"clr-namespace:SO">
...
<local:NameAndImageList />
...
</Window>
选项2 创建一个DataTemplate,它会显示代表您的列表的自定义类型。
在代码中(通常,这在MVVM模型中称为ViewModel),定义以下类型:
public class PersonCollection : ObservableCollection<Person> { }
您的类型派生自Person的ObservableCollection(包含该项的类),没有添加。这只是XAML可以理解的别名。然后,在app.xaml文件中,在&lt; Application.Resources&gt;内。部分,定义以下模板:
<DataTemplate TargetType="{x:Type local:PersonCollection}" x:Key="ImageAndNameTemplate">
<ListBox ...>
...
</ListBox>
</DataTemplate>
为了重用,只需在任何面板中删除PersonCollection数据(通常,它将来自DataContext),或在ContentControl中使用绑定:
<Window ... >
<Window.DataContext>
<!-- Instantiate the data. There are many other ways to do that -->
<local:PersonCollection>
<local:Person Name="..." Image="..." />
<local:Person Name="..." Image="..." />
<local:Person Name="..." Image="..." />
...
</local:PersonCollection>
</Window.DataContext>
...
<ContentControl Content="{Binding}" ContentTemplate="{StaticResource ImageAndNameTemplate}" />
</Window>