有没有办法在运行时更改 GridViewColumn 的 CellTemplate?
Is there a way to change CellTemplate of GridViewColumn at Runtime?
在 XAML 中,在 Windows.Resources 中,我有 2 个 DataTemplate
<Window.Resources>
<DataTemplate x:Key="HorribleTemplate">
(...Horrible Stuff here )
</DataTemplate>
<DataTemplate x:Key="AwesomeTemplate">
(...Awesome Stuff here )
</DataTemplate>
</Window.Resources>
我创建了一个 ListView 控件,它默认使用 HorribleTemplate 作为其 CellTemplate。有没有办法在运行时将 Listview 的 CellTemplate 更改为 AwesomeTemplate?
使用Triggers时,需要使用Style设置初始值属性,否则新值不会优先,会一直使用旧值。这是因为 属性 值优先。
使用触发器:
<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>
来自代码隐藏:
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" }; } }
}
}
在 XAML 中,在 Windows.Resources 中,我有 2 个 DataTemplate
<Window.Resources>
<DataTemplate x:Key="HorribleTemplate">
(...Horrible Stuff here )
</DataTemplate>
<DataTemplate x:Key="AwesomeTemplate">
(...Awesome Stuff here )
</DataTemplate>
</Window.Resources>
我创建了一个 ListView 控件,它默认使用 HorribleTemplate 作为其 CellTemplate。有没有办法在运行时将 Listview 的 CellTemplate 更改为 AwesomeTemplate?
使用Triggers时,需要使用Style设置初始值属性,否则新值不会优先,会一直使用旧值。这是因为 属性 值优先。
使用触发器:
<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>
来自代码隐藏:
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" }; } }
}
}