深入浅出WPF 第二部分(29)

本文介绍WPF中DataTrigger和MultiDataTrigger的应用方法。DataTrigger可根据数据源的变化触发UI更新,示例展示了如何通过自定义转换器实现文本框长度限制的视觉反馈。MultiDataTrigger则用于满足多个数据条件时触发样式变化,示例通过设定学生信息的特定组合来改变列表项背景。

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; }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值