wpf之DataTrigger 数据触发器
wpf中,根据数据的值的不同,UI的界面随之改变(显示控件、隐藏控件以及改变控件的其它属性),
这时我们可以用DataTrigger数据触发器。
下面两个案例实现同样的功能,当条件(数据的值)不同时,显示不同的按钮。
创建 Core类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel; namespace DataTriggerDemo2
{
public class Core : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
} private string condition; public string Condition
{
get { return condition; }
set
{
condition = value;
OnPropertyChanged("Condition");
}
}
}
}
XAML:
<Window x:Class="DataTriggerDemo2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataTriggerDemo2"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<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>
<DockPanel LastChildFill="True" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window, AncestorLevel=1}, Path=DataContext}">
<TextBlock DockPanel.Dock="Top" Text="按钮列表" HorizontalAlignment="Center" FontSize="18"/>
<Border DockPanel.Dock="Right" Width="160">
<StackPanel Orientation="Vertical">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" FontSize="16" Text="{Binding Source={StaticResource ResourceKey=core},Path=Condition}"/>
<Button x:Name="btn1" Content="编辑按钮1" Visibility="Collapsed"/>
<Button x:Name="btn2" Content="编辑按钮2" Visibility="Collapsed"/>
<Button x:Name="btn3" Content="编辑按钮3" Visibility="Collapsed"/>
<Button x:Name="btn4" Content="编辑按钮4" Visibility="Collapsed"/>
</StackPanel>
</Border>
</DockPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Source={StaticResource ResourceKey=core},Path=Condition}" Value="条件1">
<Setter TargetName="btn1" Property="Visibility" Value="Visible"/>
</DataTrigger>
<DataTrigger Binding="{Binding Source={StaticResource ResourceKey=core},Path=Condition}" Value="条件2">
<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="btn1" Property="Visibility" Value="Visible"/>
<Setter TargetName="btn2" Property="Visibility" Value="Visible"/>
<Setter TargetName="btn3" Property="Visibility" Value="Visible"/>
</DataTrigger>
<DataTrigger Binding="{Binding Source={StaticResource ResourceKey=core},Path=Condition}" Value="条件4">
<Setter TargetName="btn1" Property="Visibility" Value="Visible"/>
<Setter TargetName="btn2" Property="Visibility" Value="Visible"/>
<Setter TargetName="btn3" Property="Visibility" Value="Visible"/>
<Setter TargetName="btn4" Property="Visibility" Value="Visible"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
</Grid>
</Window>
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes; namespace DataTriggerDemo2
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private Core core;
public MainWindow()
{
InitializeComponent();
} private void Window_Loaded(object sender, RoutedEventArgs e)
{
core = this.FindResource("core") as Core;
core.Condition = "条件3";
}
}
}
Loaded方法里赋值: core.Condition = "条件3",

则数据触发器触发相应的DataTrigger:

运行结果只显示三个按钮:

wpf的灵活之处在与,同样的效果可以用很多种方法实现。
下面介绍另一种实现方法:
首先创建wpf应用程序,引用下面两个dll:

Xaml头部引用名称空间:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
完整Xaml:
<Window x:Class="DataTriggerDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:local="clr-namespace:DataTriggerDemo"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded" DataContext="{DynamicResource ResourceKey=core}">
<Window.Resources>
<local:Core x:Key="core" />
</Window.Resources>
<Grid>
<DockPanel LastChildFill="True" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window, AncestorLevel=1}, Path=DataContext}">
<TextBlock DockPanel.Dock="Top" Text="按钮列表" HorizontalAlignment="Center" FontSize="18"/>
<Border DockPanel.Dock="Right" Width="160">
<StackPanel Orientation="Vertical">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18" Text="{Binding Path=Condition}"/>
<Button x:Name="btn1" Content="编辑按钮1" Visibility="Collapsed"/>
<Button x:Name="btn2" Content="编辑按钮2" Visibility="Collapsed"/>
<Button x:Name="btn3" Content="编辑按钮3" Visibility="Collapsed"/>
<Button x:Name="btn4" Content="编辑按钮4" Visibility="Collapsed"/>
</StackPanel>
</Border>
</DockPanel>
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding Path=Condition}" Value="条件1">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=btn1}" TargetName="Button" PropertyName="Visibility" Value="Visible"/>
<ei:ChangePropertyAction TargetObject="{Binding ElementName=btn2}" TargetName="Button" PropertyName="Visibility" Value="Visible"/>
<ei:ChangePropertyAction TargetObject="{Binding ElementName=btn3}" TargetName="Button" PropertyName="Visibility" Value="Visible"/>
<ei:ChangePropertyAction TargetObject="{Binding ElementName=btn4}" TargetName="Button" PropertyName="Visibility" Value="Visible"/>
</ei:DataTrigger>
<ei:DataTrigger Binding="{Binding Path=Condition}" Value="条件2">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=btn2}" TargetName="Button" PropertyName="Visibility" Value="Visible"/>
<ei:ChangePropertyAction TargetObject="{Binding ElementName=btn3}" TargetName="Button" PropertyName="Visibility" Value="Visible"/>
<ei:ChangePropertyAction TargetObject="{Binding ElementName=btn4}" TargetName="Button" PropertyName="Visibility" Value="Visible"/>
</ei:DataTrigger>
<ei:DataTrigger Binding="{Binding Path=Condition}" Value="条件3">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=btn3}" TargetName="Button" PropertyName="Visibility" Value="Visible"/>
<ei:ChangePropertyAction TargetObject="{Binding ElementName=btn4}" TargetName="Button" PropertyName="Visibility" Value="Visible"/>
</ei:DataTrigger>
<ei:DataTrigger Binding="{Binding Path=Condition}" Value="条件4">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=btn4}" TargetName="Button" PropertyName="Visibility" Value="Visible"/>
</ei:DataTrigger>
</i:Interaction.Triggers>
</Grid>
</Window>
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes; namespace DataTriggerDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private Core core;
public MainWindow()
{
InitializeComponent();
} private void Window_Loaded(object sender, RoutedEventArgs e)
{
core = this.FindResource("core") as Core;
core.Condition = "条件3";
}
}
}
窗体的 loaded事件加载数据时设置 core.Condition = "条件3",
运行结果如下图:

与XAML里的数据触发器执行的预期效果是一样的:

wpf之DataTrigger 数据触发器的更多相关文章
- WPF 精修篇 数据触发器
原文:WPF 精修篇 数据触发器 数据触发器 可以使用Binding 来绑定控件 或者数据源 来触发相关动作 举栗子 <Window.Resources> <Style Target ...
- WPF DataTrigger数据触发器
1.通过绑定的属性值变化,动态改变界面的显示,比如绑定了IsExpanded,当为true,grid高度变成600,反之,grid高度变成320. <Grid.Style> <Sty ...
- WPF三种基本触发器与【与或】逻辑触发器
wpf中的触发器是应用于程序界面模板.样式.皮肤.主题的基础.以下作为学习的记录. 1,三种基本触发器,属性触发器.数据触发器.事件触发器 属性触发器 <!--属性触发器--> <T ...
- WPF的DataTrigger使用
首先创建一个空的项目 然后看看前台写的代码,如下图所示 <Grid> <StackPanel HorizontalAlignment="Center" Verti ...
- WPF中的数据验证
数据验证 WPF的Binding使得数据能够在数据源和目标之间流通,在数据流通的中间,便能够对数据做一些处理. 数据转换和数据验证便是在数据从源到目标 or 从目标到源 的时候对数据的验证和转换. V ...
- WPF中的数据模板(DataTemplate)(转)
原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html WPF中的数据模板(DataTemplate) ...
- CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本
CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09) 事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便 ...
- WPF的DataTrigger绑定自身属性
原文:WPF的DataTrigger绑定自身属性 <DataTrigger Binding="{Binding RelativeSource={RelativeSource self} ...
- WPF中的数据模板(DataTemplate)
原文:WPF中的数据模板(DataTemplate) WPF中的数据模板(DataTemplate) ...
随机推荐
- C# 语言规范_版本5.0 (第8章 语句)
1. 语句 C# 提供各种语句.使用过 C 和 C++ 编程的开发人员熟悉其中大多数语句. statement: labeled-statement declaration-statement emb ...
- git在webstorm中的使用
打开webstorm新建项目,这里新建的项目名称我起为lianxi 打开设置选项里的插件栏 搜索gitignore,并安装,我这里已安装,所以显示X,没有安装的会显示一个绿色的下载箭头.安装完后需要重 ...
- ORACLE ORDER BY用法总结
order by后面的形式却比较新颖(对于我来说哦),以前从来没看过这种用法,就想记下来,正好总结一下ORDER BY的知识. 1.ORDER BY 中关于NULL的处理 缺省处理,Oracle在Or ...
- 线性规划?数学?差分约束?Good Bye 2016 C
http://codeforces.com/contest/750/problem/C 反正我不会这道题...为什么那么多人做出来了...我好菜.jpg 题目大意:cf每个人都有分数,每次都会在div ...
- Qt对ini文件的读写
研究了以下Qt下ini文件的读写,不废话,上干货. 写入ini文件 WriteIni.cpp void WriteIni::writeSettings() { QSettings settings(& ...
- linux基础概念
linux的哲学思想 一切皆文件:把几乎所有资源,包括硬件设备都组织为文件格式 由众多单一目的小程序组成:一个程序只实现一个功能,通过组合小程序完成复杂任务 尽量避免跟用户交互:实现脚本编程,以自动完 ...
- freemarker + spring mvc + spring + mybatis + mysql + maven项目搭建
今天说说搭建项目,使用freemarker + spring mvc + spring + mybatis + mysql + maven搭建web项目. 先假设您已经配置好eclipse的maven ...
- ansible尝试
1.下载软件 http://releases.ansible.com/ansible/ 2.软件安装 [root@Yangjian-VM02-241 ansible-stable-2.0.0.1]# ...
- windows API实现用户选择文件路径的对话框
在编写应用程序时,有时需要用户选择某个文件,以供应用程序使用,比如在某些管理程序中需要打开某一个进程,这个时候需要弹出一个对话框来将文件路径以树形图的形式表示出来,以图形化的方式供用户选择文件路径,而 ...
- Intent Flag实际项目 -- 超时跳转登录界面并清理前面所有activity
项目中涉及到登录超时跳转登录界面的逻辑,我以前的跳转flag为Intent.FLAG_ACTIVITY_CLEAR_TOP,但是点击返回按钮还是会回到上个界面.代码如下: ActivityUtils. ...