WPF:是否可以创建一些ListView.View模板并在运行时动态选择一个?

时间:2009-11-12 09:56:16

标签: wpf templates listview gridview

我希望ListView控件可以填充多种不同对象类型中的一种(不混合,总是只有一种类型)。我想动态调整列以对应于列表中当前的对象类型。

我知道我可以通过编程方式执行此操作(Adding Columns programatically to listview in WPF?),但我想知道是否可以将XAML中的不同列描述(GridView s)定义为资源,然后选择运行时需要的列描述 - 对象类型更改时的时间?

澄清 我正在使用ListView控件来显示列中的详细信息。列的定义如下:

<ListView x:Name="TheList">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Columns" Width="80"/>
            <GridViewColumn Header="Added" Width="80"/>
            <GridViewColumn Header="Automatically" Width="100"/>
        </GridView>
    </ListView.View>
</ListView>

我的问题是:我可以定义多个ListView.View部分,并根据列表中的对象类型在它们之间切换吗?该列表一次只包含一种类型的对象。我只需要显示一组不同的属性。

到目前为止我收到的回复似乎假设我有一个包含混合对象的简单列表。事实并非如此。我正在寻找的是这样的:

Name        Address      Town
-----------------------------------------
Liz         Buck House   London
Angie       Block House  Berlin

然后切换到完全不同的东西:

Town       Population
------------------------------
London     123456
Swansea    65432

也许我让这太复杂了......

2 个答案:

答案 0 :(得分:2)

首先,定义一个DataTemplate

<DataTemplate x:Key="MyListTemplate">
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
        <TextBlock FontSize="14" Foreground="Black" Name="tbNombre" Padding="5">
            <TextBlock.Text>
                <Binding Path="Nombre"></Binding>
            </TextBlock.Text>
        </TextBlock>
    </StackPanel>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=Active}"
                            Value="False">
            <Setter TargetName="tbNombre" Property="Foreground" Value="Silver" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

之后,动态更改数据模板:

Dim template As DataTemplate = Application.Current.Resources("MyListTemplate")
MyList.ItemTemplate = template

答案 1 :(得分:1)

如果您根据对象的类型选择模板,则只需将模板的DataType属性设置为该对象即可。然后WPF将选择与项目类型匹配的模板。

<DataTemplate DataType="{x:Type l:MyType}"> ...

如果要根据类型中的某些属性选择模板,DataTemplateSelector可能更好。

有关详细信息,请参阅Bea Stollnitz's blog