Wahyu
Wahyu

Reputation: 5031

Is there a way to change CellTemplate of GridViewColumn at Runtime?

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

Answers (1)

AnjumSKhan
AnjumSKhan

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

Related Questions