使用app.xaml中的模板切换列表视图?

时间:2012-02-29 19:44:11

标签: c# wpf templates xaml listview

我制作了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”中设置)

1 个答案:

答案 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>