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

时间:2014-06-26 16:28:19

标签: c# wpf listview itemtemplate

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

代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        List<TransactionItem> item = new List<TransactionItem>();
        item.Add(new TransactionItem() { category="Deska", index="2", name="Topielec"});
        List<object> transactions = new List<object>();
        transactions.Add(new Transaction() { name = "Maciek", surname = "Chludzinski", begin = "Dzisiaj 20:14", end = "Dzisiaj 21:14", price = "240 zł", remain = "42 minuty", items = item });
        obMainListBinding.ItemTemplate = (DataTemplate)this.FindResource("LessClientTemplate");
        MessageBox.Show(obMainListBinding.ItemTemplate.DataTemplateKey.ToString());
        transactions.Insert(1, new Transaction() { name = "jhadf", surname = "Chludzhadfi", begin = "Dhad:14", end = "Dzisiajah", price = "240 zł", remain = "42 minuty"});
        obMainListBinding.ItemTemplate = (DataTemplate)this.FindResource("BasicTransactionTemplate");
        obMainListBinding.ItemsSource = transactions;

    }

    public class Transaction
    {
        public string name { get; set; }
        public string surname { get; set; }
        public string begin { get; set; }
        public string end { get; set; }
        public string remain { get; set; }
        public string price { get; set; }
        public List<TransactionItem> items { get; set; }
    }

    public class TransactionItem
    {
        public string category { get; set; }
        public string index { get; set; }
        public string name { get;set; }
    }

    public class LessTransaction
    {
        public string name { get; set; }
        public string surname { get; set; }
        public string begin { get; set; }
        public string end { get; set; }
        public string remain { get; set; }
        public string price { get; set; }
    }

}

XAML:

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

1 个答案:

答案 0 :(得分:1)

您可以尝试使用ItemTemplateSelector属性:

How do I use a ItemTemplateSelector together with a HeaderTemplate in a WPF ListView?

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

How to change control template from Style.Triggers

修改

要使用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;
    }
  }