【WPF属性笔记】【DataTrigger】

触发器系列(2) DataTrigger 触发条件: DataTrigger是以控件DataContext的属性作为触发条件 本例效果说明: 代码如下: 阅读详情
AI摘要

本文介绍了 WPF 中 DataTrigger 的使用方法,并通过一个实战案例展示了如何根据数据变化动态调整 UI 控件的显示状态。案例中实现了根据条件切换不同按钮的可见性。

WPF属性笔记系列

第一章 【WPF属性笔记】【IsHitTestVisible】
第二章 【WPF属性笔记】【DataTrigger】



前言

关于WPF属性DataTrigger的学习笔记。


一、DataTrigger介绍

  • WPF中,根据数据的值不同,UI的界面随之改变(显示控件、隐藏控件以及改变控件的其他属性),这时我们可以用DataTrigger触发器

二、DataTrigger的使用

下面的案例实现功能,根据条件(数据的值)不同时,显示不同的按钮。
从案例的运行效果图中可以看到,当Condition的值变化时,将会触发xaml中的事件,从而改变控件原本的显示状态。

xaml:

<Window.Resources>
    <local:Core x:Key="core" />
    <Style TargetType="{x:Type Button}">
        <Setter Property="Margin" Value="5" />
        <Setter Property="Padding" Value="0,8.5" />
        <Setter Property="FontSize" Value="16" />
    </Style>
</Window.Resources>
<Grid>
    <ContentControl>
        <ContentControl.ContentTemplate>
            <DataTemplate>
                <StackPanel>
                    <WrapPanel HorizontalAlignment="Center">
                        <Button Content="条件1" Click="Button_Click_1"/>
                        <Button Content="条件2" Click="Button_Click_2"/>
                        <Button Content="条件3" Click="Button_Click_3"/>
                    </WrapPanel>
                    <TextBlock Text="按钮列表" HorizontalAlignment="Center" FontSize="18"/>
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" FontSize="16" Text="{Binding Source={StaticResource ResourceKey=core},Path=Condition}"/>
                    <CheckBox x:Name="cb1" IsChecked="True" HorizontalAlignment="Center" Visibility="Collapsed"/>
                    <TextBox x:Name="tb2" Text="666666" HorizontalAlignment="Center" Visibility="Collapsed"/>
                    <ComboBox x:Name="cbb3" HorizontalAlignment="Center" Visibility="Collapsed"/>
                    <Button x:Name="btn1" Content="编辑按钮1" Visibility="Collapsed"/>
                    <Button x:Name="btn2" Content="编辑按钮2" Visibility="Collapsed"/>
                    <Button x:Name="btn3" Content="编辑按钮3" Visibility="Collapsed"/>
                </StackPanel>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Source={StaticResource ResourceKey=core},Path=Condition}" Value="条件1">
                        <Setter TargetName="cb1" Property="Visibility" Value="Visible" />
                        <Setter TargetName="btn1" Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Source={StaticResource ResourceKey=core},Path=Condition}" Value="条件2">
                        <Setter TargetName="tb2" Property="Visibility" Value="Visible" />
                        <Setter TargetName="btn1" Property="Visibility" Value="Visible"/>
                        <Setter TargetName="btn2" Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Source={StaticResource ResourceKey=core},Path=Condition}" Value="条件3">
                        <Setter TargetName="cbb3" Property="Visibility" Value="Visible" />
                        <Setter TargetName="btn1" Property="Visibility" Value="Visible"/>
                        <Setter TargetName="btn2" Property="Visibility" Value="Visible"/>
                        <Setter TargetName="btn3" Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ContentControl.ContentTemplate>
    </ContentControl>
</Grid>

通知类

public class ProperyChangeBase : INotifyPropertyChanged, INotifyPropertyChanging
{
    public event PropertyChangedEventHandler? PropertyChanged;

    public event PropertyChangingEventHandler? PropertyChanging;

    public void NotifyPropertyChanged(string propertyName)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public void NotifyPropertyChanging(string propertyName)
    {
        this.PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(propertyName));
    }

    public void OnPropertyChanged(string propertyName)
    {
        NotifyPropertyChanged(propertyName);
    }

    public void OnPropertyChanging(string propertyName)
    {
        NotifyPropertyChanging(propertyName);
    }

    public void SetProperty([CallerMemberName] string? propertyName = null)
    {
        if (propertyName != null)
        {
            NotifyPropertyChanged(propertyName);
        }
    }

    public void SetProperty<T>(ref T field, T newValue, [CallerMemberName] string? propertyName = null)
    {
        if (field != null && newValue != null)
        {
            SetProperty_Null(ref field, newValue, propertyName);
        }
    }

    public void SetProperty_Null<T>(ref T field, T newValue, [CallerMemberName] string? propertyName = null)
    {
        if (!EqualityComparer<T>.Default.Equals(field, newValue))
        {
            if (string.IsNullOrEmpty(propertyName))
            {
                field = newValue;
                return;
            }

            NotifyPropertyChanging(propertyName);
            field = newValue;
            NotifyPropertyChanged(propertyName);
        }
    }

    public void SetProperty<T>(T oldValue, T newValue, Action<T> callback, [CallerMemberName] string? propertyName = null)
    {
        if (oldValue != null && newValue != null && !EqualityComparer<T>.Default.Equals(oldValue, newValue))
        {
            if (string.IsNullOrEmpty(propertyName))
            {
                callback(newValue);
                return;
            }

            NotifyPropertyChanging(propertyName);
            callback(newValue);
            NotifyPropertyChanged(propertyName);
        }
    }
}

实体类

public class Core : ProperyChangeBase
{
    public string Condition
    {
        get => _Condition;
        set { SetProperty(ref _Condition, value); }
    }
    private string _Condition = "条件1";
}

C# 代码:

private Core core1 = new Core();
public MainWindow()
{
    InitializeComponent();
    if (this.FindResource("core") is Core thecore)
    {
        core1 = thecore;
    }

    core1.Condition = "条件3";
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    core1.Condition = "条件1";
}

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    core1.Condition = "条件2";
}

private void Button_Click_3(object sender, RoutedEventArgs e)
{
    core1.Condition = "条件3";
}

展现效果:
在这里插入图片描述

总结

不积硅步,何以至千里

WPF控件交互技巧:除了Visibility,DataTrigger还能这样玩! 本文深入探讨WPF中DataTrigger的高阶应用技巧,超越基础的显示与隐藏功能,展示其在动态样式切换、交互状态管理、布局调整等方面的强大潜力。通过实际代码示例,帮助开发者掌握DataTrigger在MVVM模式下的高效用法,提升WPF应用的交互体验和视觉反馈。 阅读详情

相关推荐

WPF DataTrigger的一个简单实例

:::[下载程序源文件]::: 在这篇文章里,我会示范运用DataTrigger,在纯WPF的环境下,编写一个动态的资料验证程序。这个程序所用到的编写方法,并不是很规范。为什么呢?因为程序里用了Tag这个WPF的元件属性,我的用法不太规范。不过,这个示例包含的技巧,还是值得在这儿给大家分享的。 (1)程序的图形界面:猜我喜欢的颜色--错了显示“No,try again...”,

Freedigits的专栏 1786

【WPF】DataTrigger 与 Storyboard动画

节点的目的在于我们需要对其做位移、旋转、缩放、斜切动画时,需要针对该属性做设置,否则会报错。创建依赖属性的目的是为了在其他地方使用这个控件的时候,可以绑定到Model的属性上。但是当我在开发过程中需要在指定属性变更之后,才开始动画。动画是应用程序与用户交互的灵魂。目前接触到的更多的关于动画的。如果要实现值的绑定,在WPF中,需要使用。创建控件(控件添加一外名称属性 )后,添加一个依赖属性。在控件中,针对一个元素,在接下来的示例中,使用。属性,可以直接设置,不需要设置上述的。配合使用来达到动画的目的。

Tew_q的博客 2145

C#WPF的Style 中触发器Trigger详解

本文详解C#WPF的Style 中触发器Trigger

qq_30725967的博客 3141

使用DataTrigger自定义WPF DataGrid行样式

在WPF开发中,通过DataTrigger可以方便地根据数据的变化自定义控件的样式。本文将展示如何在DataGrid中使用DataTrigger根据条件动态改变行的背景颜色和字体样式。接下来,我们在DataGrid的RowStyle中定义多个DataTrigger,根据不同的年龄值改变行的背景颜色。当CheckBox被选中时,改变字体颜色和样式:"19""20""21""True""Red""FontSize""16""Bold"

波波诸葛伟 2293

基于远程服务器 Tip_Adapter源码从零开始复现

从零一步步实现源代码的运行

zcyzcyjava的博客 1602

Mid-360与FAST-LIO2实战:从点云采集到高精度建图全流程解析

本文详细解析了使用Livox Mid-360激光雷达与FAST-LIO2算法实现高精度实时建图的全流程。内容涵盖硬件准备、软件环境搭建、算法部署配置、数据采集实战,并重点探讨了多楼层场景下的参数调优与误差抑制策略,为机器人及无人机三维感知应用提供了实用指南。

prometheus9mon的博客 413

WPF触发器(Trigger、DataTrigger、EventTrigger)

WPF中有种叫做触发器的东西(记住不是数据库的trigger哦)。它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作。 WPFtrigger的主要类型有:Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种。从字面意思上我们想大家已经知道个大概,接下来我将还会用实例代码逐一进行介绍。trig

Leo‘s Blog 4万+

DrissionPage实战:5分钟搞定京东滑块验证码自动登录(附完整轨迹生成代码)

本文详细介绍了如何使用DrissionPage工具实现京东滑块验证码的自动化登录,包括环境配置、滑块缺口识别、拟人化轨迹生成算法及完整登录流程。通过物理运动学模型和智能识别技术,有效提升验证码破解成功率,适用于电商自动化场景。

weixin_29229055的博客 243

wpf之DataTrigger 数据触发器

wpf中,根据数据的值的不同,UI的界面随之改变(显示控件、隐藏控件以及改变控件的其它属性), 这时我们可以用DataTrigger数据触发器。 下面两个案例实现同样的功能,当条件(数据的值)不同时,显示不同的按钮。 创建 Core类: using System; using System.Collections.Generic; using Syste...

weixin_33674976的博客 3925

UE4载具性能调优指南:从参数设置到实战优化

本文详细解析了UE4载具性能调优的关键技巧,从WheeledVehicle类构建到轮子参数、传动系统设置,再到物理属性与操控调校。通过实战案例分享,帮助开发者优化载具的速度、加速度等核心性能,提升游戏体验。特别适合需要精细调校载具物理特性的开发者参考。

weixin_29019241的博客 469

基于STM32、HAL库的W25Q01JVZEIQ TR FLASH存储器驱动应用程序设计

1Gb (128MB),分为512个可擦除块(block),每个块256KB。:块擦除约30-50ms,芯片擦除约30s。:标准SPI (支持1/2/4线模式)// 初始化CS引脚为高电平。// 擦除扇区(4KB)// 初始化Flash。/* 状态寄存器位 *//* 指令定义 *//* 超时定义 *//* 函数声明 */

corlin6688的博客 266

WPF中如何使用DataTrigger触发动画

示例:当等待图片加载时,给图标一个等待的旋转动画,以及停止动画 <ControlTemplate TargetType="controls:ImageButton"> <Image Name="ImageWaiting" Width="32" Height="32" Margin="20,10,20,5" Source="pack://siteofor...

EnTaroAdun 2235

Office系列完全干净卸载工具合集(最全)

使用 Microsoft Fix it 卸载 Microsoft Office 套件 一、Windows 7、Windows Vista或Windows XP下卸载Office 1.MicrosoftEasyFix50416 工具用来卸载office 2003 MicrosoftEasyFix50416_Office2003.msi 2.MicrosoftEasyFix50154 工具用来卸载office 2007 MicrosoftEasyFix50154_Office2007.msi 3.Microso

业精于勤,荒于嬉 3万+

wpf触发器DataTrigger绑定切换

<Style x:Key="playBtn" TargetType="{x:Type control:ButtonWithIcon}"> <Setter Property="Cursor" Value="Hand"/> <Setter Property="Width" Value="28"/> ...

FireGhost57的专栏 1874

ST03N 里看不到 SE38 / SA38?别急,这不是没记录,而是被换了名字

摘要:SAP系统中SE38/SA38事务码在ST03N统计中可能"隐身",因其对话步骤被归集到对应的程序名(如SE38→RSABAPPROGRAM)。ST03N侧重工作负载聚合统计,而STAD提供短期明细记录。正确排查方法是:在ST03N中搜索程序名而非事务码,再通过STAD验证具体使用情况。这一现象在权限整改和审计中易造成误判,建议将程序名纳入常规监控,并区分ST03N(趋势分析)与STAD(事实校验)的不同用途。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 953

【S32K3 MCAL配置】-3.4-CANFD配置-接收特定的“经典CAN/CANFD标准帧”和“经典CAN/CANFD扩展帧”(基于MCAL+FreeRTOS)

【S32K3 MCAL配置】-3.4-CANFD配置-接收特定的“经典CAN/CANFD标准帧”和“经典CAN/CANFD扩展帧”(基于MCAL+FreeRTOS)

「汽车电子助手」的博客 696

WPF-Samples 实战:使用 DataTrigger 与 MultiDataTrigger 实现数据驱动样式切换

本篇文章以微软官方 WPF-Samples 仓库中的 [Binding Using Data Triggers Sample](https://link.gitcode.com/i/b401fd8a600523a674afce2e9f15614b) 为核心,完整讲解 WPF 中 **DataTrigger(单条件数据触发器)** 与 **MultiDataTrigger(多条件数据触发器)** 的

gitblog_00554的博客 800

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

WPF的DataTrigger绑定自身属性

WPF的DataTrigger绑定自身属性 原文:WPF的DataTrigger绑定自身属性 <DataTrigger Binding="{Binding RelativeSource={RelativeSource se...

weixin_30468137的博客 836

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WPF DataTemplate_DataTrigger Animation

今天找到个明白人,终于把DataTrigger里的动画搞出来了                                                                                                                  Storyboard.TargetName="ImageBorder"                  

little rabbit 1794

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从 WPF 到 Avalonia 的迁移系列实战篇6:Trigger、MultiTrigger、DataTrigger 的迁移

本文介绍了如何从WPF的Trigger、MultiTrigger和DataTrigger迁移到Avalonia的等效实现。在Avalonia中,WPF的Trigger可通过伪类选择器(如:pointerover、:pressed)替代,MultiTrigger则使用组合伪类实现。对于DataTrigger,Avalonia提供了DataTriggerBehavior或绑定转换器来实现数据驱动的样式变化。文章通过具体代码示例展示了WPF和Avalonia两种框架下的实现对比,并附有完整的项目源码供参考。

玉面小浪君的博客 1127

WPF中触发器Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种

WPF中有种叫做触发器的东西(记住不是数据库的trigger哦)。它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作。 WPFtrigger的主要类型有:Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种。从字面意思上我们想大家已经知道个大概,接下来我将还会用实例代码逐一进行介绍...

anzhenji7632的博客 1573

突破WPF限制:HandyControl中DataTrigger的10种高级条件动画实现

你是否还在为WPF中简单的属性触发动画而困扰?是否需要更复杂的条件逻辑来控制UI状态变化?HandyControl框架中的DataTrigger(数据触发器)机制为解决这些问题提供了强大支持。本文将深入解析HandyControl中DataTrigger的高级应用,通过10个实战案例展示如何利用条件动画实现复杂UI交互效果,从基础绑定到多条件组合,从性能优化到场景化解决方案,全方位提升你的WPF动...

gitblog_00261的博客 759

WPF中DataTrigger不响应问题

正确的代码: <TreeView Grid.Row="2" Grid.RowSpan="4" Grid.Column="1" Grid.ColumnSpan="2"> <TreeView.Style> <Style...

yanggengzhen的博客 1791

wpf 非常漂亮ItemsControl DataTrigger 里面的元素不同值不同的颜色 DataTrigger TextBlock如何设置有值就有背景颜色,如果内容为空就没有颜色

在这个例子中,我们设置了三个DataTrigger来检查TextBlock的Text属性是否为空、null或String.Empty。如果满足这些条件,背景色将被设置为透明。最后一个DataTrigger用于当TextBlock有值时设置你想要的背景颜色。在WPF中,可以通过DataTrigger和Binding来实现根据TextBlock内容是否有值来改变背景颜色。请注意,这个示例使用了。

weijia3624的专栏 7515
上一篇: 【WPF属性笔记】【IsHitTestVisible】
下一篇: WPF父容器根据內部控件的拖拽自动扩展大小
Aflashstar
博客等级 码龄12年 205粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值