3. 由数据触发的DataTrigger
程序中京城会遇到基于数据执行某些判断情况,遇到这种情况时我们可以考虑使用DataTriger。DataTriger对象的Binding属性会把数据源源不断送过来,一旦送过来的值与Value属性一致,DataTriger就会触发。
using System;
using System.Windows.Data;
namespace WpfApp4.Converters
{
class StringToBooleanConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string str = value as string;
if (!string.IsNullOrEmpty(str) && str.Length > 6)
return false;
else
return true;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
<Window x:Class="WpfApp4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:WpfApp4.Converters"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<converters:StringToBooleanConverter x:Key="cvtr" />
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<DataTrigger
Binding="{Binding RelativeSource={x:Static Member=RelativeSource.Self}, Path=Text, Converter={StaticResource cvtr}}" Value="false">
<Setter Property="BorderBrush" Value="Red"/>
<Setter Property="BorderThickness" Value="1"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<TextBox Margin="5"/>
</StackPanel>
</Window>
4. 多数据条件触发的MultiDataTrigger
有时我们会遇到要求多个数据条件同时满足时才能触发变化的需求,此时可以考虑使用MultiDataTriger。
<Window x:Class="WpfApp4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:WpfApp4.Converters"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<converters:StringToBooleanConverter x:Key="cvtr" />
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ID}" Width="60"/>
<TextBlock Text="{Binding Name}" Width="120"/>
<TextBlock Text="{Binding Age}" Width="60"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=ID}" Value="2"/>
<Condition Binding="{Binding Path=Name}" Value="Tom"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Background" Value="Orange"/>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<ListBox x:Name="listBoxStudent" Margin="5"/>
</StackPanel>
</Window>
public partial class MainWindow : Window
{
List<Student> stus = new List<Student>()
{
new Student() { ID = 1, Name = "Anders", Age = 27 },
new Student() { ID = 2, Name = "Tom", Age = 22 },
new Student() { ID = 3, Name = "Jim", Age = 23 },
new Student() { ID = 4, Name = "Jack", Age = 24 },
new Student() { ID = 5, Name = "Mary", Age = 25 },
};
public MainWindow()
{
InitializeComponent();
this.listBoxStudent.ItemsSource = this.stus;
}
}
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
本文介绍WPF中DataTrigger和MultiDataTrigger的应用方法。DataTrigger可根据数据源的变化触发UI更新,示例展示了如何通过自定义转换器实现文本框长度限制的视觉反馈。MultiDataTrigger则用于满足多个数据条件时触发样式变化,示例通过设定学生信息的特定组合来改变列表项背景。

被折叠的 条评论
为什么被折叠?



