ListView上的WPF DataTemplate以可视化不同类型的用户控件

ListView上的WPF DataTemplate以可视化不同类型的用户控件,wpf,listview,datatemplate,Wpf,Listview,Datatemplate,我有一个ListView,我想展示不同类型的用户控件,这取决于为列表视图项设置的视图模型 在xaml中: <ListView ItemsSource="{Binding Items}"> <ListView.Resources> <DataTemplate DataType="{x:Type viewModels:LabelledTextViewModel}"> <contr

我有一个ListView,我想展示不同类型的用户控件,这取决于为列表视图项设置的视图模型

在xaml中:

    <ListView ItemsSource="{Binding Items}">
        <ListView.Resources>
            <DataTemplate DataType="{x:Type viewModels:LabelledTextViewModel}">
                <controls:LabelledTextBox/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewModels:FolderChooserViewModel}">
                <standardControls:FolderChooser/>
            </DataTemplate>
        </ListView.Resources>
    </ListView>


现在这很好,但是我的
LabelledTextViewModel
可以编辑,也可以不编辑。如何在XAML中检查viewmodel上的属性“IsEdit”,并根据其值显示
LabelledTextBlockControl
LabelledTextBoxControl

您可以在
数据模板中使用
DataTrigger

<ListView ItemsSource="{Binding Items}">
    <ListView.Resources>
        <DataTemplate DataType="{x:Type viewModels:LabelledTextViewModel}">
            <Grid>
                <controls:LabelledTextBlockControl x:Name="textBlock"/>
                <controls:LabelledTextBoxControl x:Name="textBox" Visibility="Collapsed"/>
            </Grid>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsEditable}" Value="True">
                    <Setter TargetName="textBlock" Property="Visibility" Value="Collapsed"/>
                    <Setter TargetName="textBox" Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
        <DataTemplate DataType="{x:Type viewModels:FolderChooserViewModel}">
            <standardControls:FolderChooser/>
        </DataTemplate>
    </ListView.Resources>
</ListView>

对于您的需求,您需要使用来为您做出选择,或者您可以尝试命名您的
数据模板
并使用
数据触发器设置它们:

<ListView>
    <ListView.Resources>
        <DataTemplate x:Key="DefaultDataTemplate" DataType="{x:Type viewModels:LabelledTextViewModel}">
            <controls:LabelledTextBox/>
        </DataTemplate>
        <DataTemplate x:Key="AnotherDataTemplate" DataType="{x:Type viewModels:FolderChooserViewModel}">
            <standardControls:FolderChooser/>
        </DataTemplate>            
    </ListView.Resources>
    <ListView.Style>
        <Style TargetType="{x:Type ListView}">
            <Setter Property="ItemTemplate" Value="{StaticResource DefaultDataTemplate}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsEditable}" Value="True">
                    <Setter Property="ItemTemplate" Value="{StaticResource AnotherDataTemplate}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListView.Style>
</ListView>

本例假设您正在将
DataTemplate
s设置为
ItemTemplate
属性。。。如果没有,则需要将该属性更改为相关属性