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 数据触发器的更多相关文章

  1. WPF 精修篇 数据触发器

    原文:WPF 精修篇 数据触发器 数据触发器 可以使用Binding 来绑定控件 或者数据源 来触发相关动作 举栗子 <Window.Resources> <Style Target ...

  2. WPF DataTrigger数据触发器

    1.通过绑定的属性值变化,动态改变界面的显示,比如绑定了IsExpanded,当为true,grid高度变成600,反之,grid高度变成320. <Grid.Style> <Sty ...

  3. WPF三种基本触发器与【与或】逻辑触发器

    wpf中的触发器是应用于程序界面模板.样式.皮肤.主题的基础.以下作为学习的记录. 1,三种基本触发器,属性触发器.数据触发器.事件触发器 属性触发器 <!--属性触发器--> <T ...

  4. WPF的DataTrigger使用

    首先创建一个空的项目 然后看看前台写的代码,如下图所示 <Grid> <StackPanel HorizontalAlignment="Center" Verti ...

  5. WPF中的数据验证

    数据验证 WPF的Binding使得数据能够在数据源和目标之间流通,在数据流通的中间,便能够对数据做一些处理. 数据转换和数据验证便是在数据从源到目标 or 从目标到源 的时候对数据的验证和转换. V ...

  6. WPF中的数据模板(DataTemplate)(转)

    原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html WPF中的数据模板(DataTemplate)        ...

  7. CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本

    CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09) 事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便 ...

  8. WPF的DataTrigger绑定自身属性

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

  9. WPF中的数据模板(DataTemplate)

    原文:WPF中的数据模板(DataTemplate) WPF中的数据模板(DataTemplate)                                                   ...

随机推荐

  1. Python学习笔记——基础篇【第六周】——hashlib模块

    常用模块之hashlib模块 用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 import ...

  2. Zeppelin使用Spark的yarn-client模式

    Zeppelin版本0.6.2 1. Export SPARK_HOME In conf/zeppelin-env.sh, export SPARK_HOME environment variable ...

  3. Windows 多用户远程访问 Ubuntu 14.04桌面

    使用X2Go实现多用户远程访问 Ubuntu 14.04桌面:VNC也可以,但是每次连接VNC就回新创建一个Seession,想要在下次远程登录的时候返回上次活动,需要记住开启的线程,这种繁琐的操作不 ...

  4. Chapter 21_2 模式匹配函数

    基础函数比较简单,就是几个普通的函数string.byte.string.char.string.rep.string.sub.string.format还有大小写转换函数upper和lower. 接 ...

  5. python的web开发环境Django配置

    我的系统的windows10: 第一步,安装python3.5 第二步,配置django,如图所示,在python的安装目录下的Scripts里面执行:pip install Django,我这儿提示 ...

  6. Java版冒泡排序和选择排序

    一.理解说明 1.理解和记忆 冒泡排序:依次定位数组元素,每次只和相邻的且符合条件的元素交换位置. 选择排序:依次在数组的每个位置,通过逐个对比选择出最大或最小的元素. 2.知识点说明 (1)数组是引 ...

  7. js获取计算的样式(非行间样式)

    function getStyle(obj, attr){ if(obj.currentStyle){ style = obj.currentStyle[attr]; //兼容IE8以下 }else{ ...

  8. @NotNull和@NotEmpty和@NotBlank区别

    1.@NotNull:不能为null,但可以为empty (""," "," ") 2.@NotEmpty:不能为null,而且长度必须大于 ...

  9. js 对象类型 (对象的属性 ,对象的方法) this 关键字

    $(function () { var observation = { init: function () { this.render();//断点:this bind :function() che ...

  10. EventBus消息机制在Eclipse环境下的使用

    1.在onStart()方法中注册 @Override public void onStart() { super.onStart(); // 注册 EventBus // 判断 Eventbus 是 ...