C# WPF-在listview中添加不同模板的项

C# WPF-在listview中添加不同模板的项,c#,wpf,listview,itemtemplate,C#,Wpf,Listview,Itemtemplate,当我的ListView上的项目被单击时,我想在它下面显示另一个不同的模板。我已经在Window.Resources中定义了模板,我想在单击项时更改ItemTemplate,添加新项并将其更改为默认模板,但我使用列表视图作为ItemsSource,它只显示一个模板,只是因为(目前)它们在绑定中是相同的。我该怎么办 代码: 公共部分类主窗口:窗口 { 公共主窗口() { 初始化组件(); 列表项=新列表(); 添加(新事务项(){category=“Deska”,index=“2”,name=“To

当我的ListView上的项目被单击时,我想在它下面显示另一个不同的模板。我已经在Window.Resources中定义了模板,我想在单击项时更改ItemTemplate,添加新项并将其更改为默认模板,但我使用列表视图作为ItemsSource,它只显示一个模板,只是因为(目前)它们在绑定中是相同的。我该怎么办

代码:

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
列表项=新列表();
添加(新事务项(){category=“Deska”,index=“2”,name=“Topielec”});
列表事务=新列表();
添加(新事务(){name=“Maciek”,姓氏=“Chludzinski”,begin=“Dzisaj 20:14”,end=“Dzisaj 21:14”,price=“240 zł”,resident=“42分钟”,items=item});
ObjMainListBinding.ItemTemplate=(DataTemplate)this.FindResource(“LessClientTemplate”);
Show(obMainListBinding.ItemTemplate.DataTemplateKey.ToString());
事务。插入(1,新事务(){name=“jhadf”,姓氏=“Chludzhadfi”,begin=“Dhad:14”,end=“dzisajah”,price=“240 zł”,remaine=“42分钟”);
ObjMainListBinding.ItemTemplate=(DataTemplate)this.FindResource(“BasicTransactionTemplate”);
ObjMainListBinding.ItemsSource=事务;
}
公共类事务
{
公共字符串名称{get;set;}
公共字符串姓氏{get;set;}
公共字符串begin{get;set;}
公共字符串结束{get;set;}
公共字符串保持{get;set;}
公共字符串price{get;set;}
公共列表项{get;set;}
}
公共类事务项
{
公共字符串类别{get;set;}
公共字符串索引{get;set;}
公共字符串名称{get;set;}
}
公共类出租
{
公共字符串名称{get;set;}
公共字符串姓氏{get;set;}
公共字符串begin{get;set;}
公共字符串结束{get;set;}
公共字符串保持{get;set;}
公共字符串price{get;set;}
}
}
XAML:



您可以尝试使用ItemTemplateSelector属性:

和(或)更改模板的触发器:

编辑

要使用TemplateSelector,您可以在项目上添加一些虚拟属性(或包装它们),这将允许您区分新项目和旧项目

...
public Int32 Generation
{
    get ...
}

public class GenerationTypeSelector : DataTemplateSelector
  {
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var transaction = (TransactionItem)item;
        if (transaction .Generation == 0)
            return Gen0Template;
        else
            return Gen1Template;
    }
  }

我们不知道如何在不查看原始代码的情况下对现有代码库进行更改。请发布,并充分解释需要修改的内容。是否必须是另一个具有不同模板的项目?您能否在UserControl中封装所需的内容,该控件根据项目是否为选定项目来更改其外观,在原始项目模板中托管它?@JimBobBennett我不认为它会起作用,因为应用程序在实际使用中会使用相当多的ram,我希望它使用尽可能少的内存。当我寻找答案时,我读到了关于ItemTemplateSelector的内容,但我认为这里的主要问题是我使用ItemsSource来填充ItemView,所以我当出现不同的(新的)对象时,无法更改模板。主要问题是您在代码隐藏文件中进行所有操作,而不是在XAML中。MVVM不是一个教条或通用的解决方案,但您应该尝试一下。进行了一些编辑,谢谢。我试图在为朋友制作此应用程序时做到这一点,但我使用Win表单已经有一段时间了,旧习惯很难改掉。而且我在理解很多概念上仍然有困难,所以大多数时候我完全困惑。我曾经有过,在某种程度上现在也有过同样的困难。任何真正新的平台或技术都需要在思维上进行彻底改革。事情就是这样——一切都不可能是一样的。这可能会让人望而生畏,但至少不会让人感到无聊。WPF和MVVM有着陡峭的学习曲线,但至少当你沉迷于它们的WinForms wi时是如此
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="SurfManager.MainWindow"
Title="MainWindow" Height="524.5" Width="1078">
<Window.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded"/>
</Window.Triggers>
<Window.Resources>
    <DataTemplate x:Key="BasicTransactionTemplate">
        <Grid MaxHeight="50">
            <Grid.RowDefinitions>
                <RowDefinition Height="41*"/>
                <RowDefinition Height="42*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0*"/>
                <ColumnDefinition Width="192*"/>
                <ColumnDefinition Width="234*"/>
                <ColumnDefinition Width="189*"/>
                <ColumnDefinition Width="443*"/>
            </Grid.ColumnDefinitions>
            <Label Name="Name" Content="{Binding name}" Grid.RowSpan="1" Grid.Column="1" Grid.ColumnSpan="1" />
            <Label Name="Surname" Content="{Binding surname}"  Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="1"/>
            <Label Name="Begin" Content="{Binding begin}" Grid.Column="2"/>
            <Label Name="End" Content="{Binding end}" Grid.Row="1" Grid.Column="2"/>
            <Label Name="Remain" Content="{Binding remain}" Grid.Column="3"/>
            <Label Name="Price" Content="{Binding price}" Grid.Row="1" Grid.Column="3"/>
            <ListView Name="lvItems" ItemsSource="{Binding items}" Grid.Column="4" Grid.RowSpan="2">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding category}" />
                            <TextBlock Text=", Nr" />
                            <TextBlock Text="{Binding index}" />
                            <TextBlock Text="{Binding name}" />
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>
    </DataTemplate>
    <DataTemplate x:Key="LessClientTemplate">
        <Grid MaxHeight="50">
            <Grid.RowDefinitions>
                <RowDefinition Height="41*"/>
                <RowDefinition Height="42*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0*"/>
                <ColumnDefinition Width="192*"/>
                <ColumnDefinition Width="234*"/>
                <ColumnDefinition Width="189*"/>
                <ColumnDefinition Width="443*"/>
            </Grid.ColumnDefinitions>
            <Label Name="Name" Content="{Binding name}" Grid.RowSpan="1" Grid.Column="1" Grid.ColumnSpan="1" />
            <Label Name="Surname" Content="{Binding surname}"  Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="1"/>
            <Label Name="Begin" Content="{Binding begin}" Grid.Column="2"/>
            <Button Name="End" Content="{Binding end}" Grid.Row="1" Grid.Column="2"/>
        </Grid>
    </DataTemplate>
</Window.Resources>
<Grid>
<TabControl>
    <TabItem Header="Obecne Wypożyczenia" Background="#FFF40AFF" Foreground="Black" BorderBrush="#FF8C8E94" OpacityMask="White">
        <Grid Background="#FFE5E5E5">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <ListView Name="obMainListBinding" BorderThickness="0" ItemTemplate="{StaticResource BasicTransactionTemplate}">
                    <ListView.Resources>
                        <Style TargetType="ListViewItem">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="ListViewItem">
                                        <Border Background="{TemplateBinding Background}">
                                            <ContentPresenter />
                                        </Border>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </ListView.Resources>
             </ListView>
        </Grid>
    </TabItem>
    <TabItem Header="Baza Klientow">
        <Grid Background="#FFE5E5E5">
                <ListView BorderThickness="0" >

                    <ListViewItem Height="66" Background="Red">
                        <Grid Background="Black" >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="0*"/>
                                <ColumnDefinition Width="0*"/>
                                <ColumnDefinition Width="0*"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="0*"/>
                                <RowDefinition Height="0*"/>
                                <RowDefinition Height="0*"/>
                            </Grid.RowDefinitions>
                        </Grid>
                    </ListViewItem>
                </ListView>
            </Grid>
    </TabItem>
    <TabItem Header="TabItem" HorizontalAlignment="Left" Height="35.293" VerticalAlignment="Top" Width="57.32" Margin="-2,-2,0,-13.333">
            <Button Content="Button"  Height="100" Margin="430,174,430,173"/>
        </TabItem>
</TabControl>
...
public Int32 Generation
{
    get ...
}

public class GenerationTypeSelector : DataTemplateSelector
  {
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var transaction = (TransactionItem)item;
        if (transaction .Generation == 0)
            return Gen0Template;
        else
            return Gen1Template;
    }
  }