【问题标题】:WPF: Is it possible to create a number of ListView.View templates and dynamically select one at run-time?WPF:是否可以创建多个 ListView.View 模板并在运行时动态选择一个?
【发布时间】:2011-08-27 03:31:02
【问题描述】:

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

我知道我可以以编程方式执行此操作 (Adding Columns programatically to listview in WPF?),但我想知道是否可以在 XAML 中将不同的列描述 (GridViews) 定义为资源,然后在运行时选择我需要的那个对象类型变化?

澄清 我正在使用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

也许我把这弄得太复杂了......

【问题讨论】:

    标签: wpf templates listview gridview


    【解决方案1】:

    首先,定义一个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
    

    【讨论】:

      【解决方案2】:

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

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

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

      请参阅Bea Stollnitz's blog 了解更多信息。

      【讨论】:

        猜你喜欢
        • 2020-08-06
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-06
        相关资源
        最近更新 更多