Reputation: 5031
In XAML, inside Windows.Resources, i have 2 DataTemplate
<Window.Resources>
<DataTemplate x:Key="HorribleTemplate">
(...Horrible Stuff here )
</DataTemplate>
<DataTemplate x:Key="AwesomeTemplate">
(...Awesome Stuff here )
</DataTemplate>
</Window.Resources>
I created a ListView control, which use the HorribleTemplate for its CellTemplate by default. Is there a way to change the CellTemplate of the Listview to AwesomeTemplate at Runtime?
Upvotes: 1
Views: 1544
Reputation: 9827
While using Triggers, you need to set initial property value using Style, otherwise new value won't take precedence, and it will keep using Old value. This happens because of Property value precedence.
Using Triggers :
<Window x:Class="WpfListBox._32674841.Win32674841"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="Win32674841" Height="300" Width="300">
<Window.Resources>
<DataTemplate x:Key="HorribleTemplate" DataType="{x:Type sys:String}">
<TextBlock Background="CadetBlue" Text="{Binding}"/>
</DataTemplate>
<DataTemplate x:Key="AwesomeTemplate" DataType="{x:Type sys:String}">
<TextBlock Background="Aqua" Text="{Binding}"/>
</DataTemplate>
</Window.Resources>
<StackPanel>
<Button Content="Change" Click="Button_Click"/>
<ListView x:Name="ListView1">
<ListView.Style>
<Style TargetType="ListView">
<Setter Property="ItemTemplate" Value="{StaticResource HorribleTemplate}"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="ItemTemplate" Value="{StaticResource AwesomeTemplate}"/>
</Trigger>
</Style.Triggers>
</Style>
</ListView.Style>
</ListView>
</StackPanel>
</Window>
From code-behind :
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
namespace WpfListBox._32674841
{
/// <summary>
/// Interaction logic for Win32674841.xaml
/// </summary>
public partial class Win32674841 : Window
{
public Win32674841()
{
InitializeComponent();
ListView1.ItemsSource = DataStore.Names;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
ListView1.ItemTemplate = (DataTemplate)this.Resources["AwesomeTemplate"];
}
}
public class DataStore
{
public static List<String> Names { get { return new List<string>() { "Anjum" }; } }
}
}
Upvotes: 1