wpf, 根据绑定的属性的值的不同(数据分类),界面上显示不同的控件(绑定不同类型的属性),可以使用数据库触发器DataTrigger实现这一功能。

实现的效果如下:

首先建立实体类:

更改通知类:

public class NotifyPropertyChangedObject : INotifyPropertyChanged
{
/// <summary>
/// 属性更改事件
/// </summary>
public event PropertyChangedEventHandler PropertyChanged; /// <summary>
/// 触发属性更改事件
/// </summary>
/// <param name="propertyName">属性名称</param>
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler propertyChanged = this.PropertyChanged; if (propertyChanged != null)
{
propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

检查定义类:

public class CheckDefine:NotifyPropertyChangedObject
{
#region Model
private Guid _checkDefineId;
private int _seqno;
private string _checkitem;
private int _checktype; /// <summary>
/// 主键id
/// </summary>
public Guid CheckDefineId
{
set
{
_checkDefineId = value;
OnPropertyChanged("CheckDefineId");
}
get { return _checkDefineId; }
} /// <summary>
/// 编号
/// </summary>
public int SeqNo
{
set
{
_seqno = value;
OnPropertyChanged("SeqNo");
}
get { return _seqno; }
}
/// <summary>
/// 检查项
/// </summary>
public string CheckItem
{
set
{
_checkitem = value;
OnPropertyChanged("CheckItem");
}
get { return _checkitem; }
}
/// <summary>
/// 1:bool ;2:text;3:Numeric
/// </summary>
public int CheckType
{
set
{
_checktype = value;
OnPropertyChanged("CheckType");
}
get { return _checktype; }
} #endregion Model
}

检查记录类:

  public class CheckRecord : NotifyPropertyChangedObject
{
#region Model
private CheckDefine _checkCheckDefine;
private Guid _checkid;
private bool? _resultbool;
private string _resulttext;
private decimal? _resultnumeric;
private Guid _userid1;
private Guid _userid2;
private DateTime? _operatingdt; /// <summary>
/// 生产前的检查(定义)
/// </summary>
public CheckDefine CheckDefine
{
set
{
_checkCheckDefine = value;
OnPropertyChanged("CheckDefine");
}
get { return _checkCheckDefine; }
} /// <summary>
/// 主键id
/// </summary>
public Guid CheckId
{
set
{
_checkid = value;
OnPropertyChanged("CheckBeforeProductionRecordid");
}
get { return _checkid; }
} /// <summary>
/// 勾选框
/// </summary>
public bool? ResultBool
{
set
{
_resultbool = value;
OnPropertyChanged("ResultBool");
}
get { return _resultbool; }
}
/// <summary>
/// 文本输入框
/// </summary>
public string ResultText
{
set
{
_resulttext = value;
OnPropertyChanged("ResultText");
}
get { return _resulttext; }
}
/// <summary>
/// 数字类型(输入框)
/// </summary>
public decimal? ResultNumeric
{
set
{
_resultnumeric = value;
OnPropertyChanged("ResultNumeric");
}
get { return _resultnumeric; }
}
/// <summary>
/// 操作人
/// </summary>
public Guid Userid1
{
set
{
_userid1 = value;
OnPropertyChanged("Userid1");
}
get { return _userid1; }
}
/// <summary>
/// 复核人
/// </summary>
public Guid Userid2
{
set
{
_userid2 = value;
OnPropertyChanged("Userid2");
}
get { return _userid2; }
}
/// <summary>
/// 检查时间
/// </summary>
public DateTime? Operatingdt
{
set
{
_operatingdt = value;
OnPropertyChanged("Operatingdt");
}
get { return _operatingdt; }
}
#endregion Model
}

xaml:

<Window x:Class="DataTriggerDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" x:Name="mainWindow">
<Grid>
<ListView ItemsSource="{Binding Path=CheckRecords, ElementName=mainWindow}">
<ListView.View>
<GridView>
<GridViewColumn Header="操作指令">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Margin="5" Text="{Binding Path=CheckDefine.CheckItem}" FontSize="16"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="操作记录">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Grid>
<TextBox x:Name="txtNum" Text="{Binding Path=ResultNumeric}" TextWrapping="Wrap" Visibility="Collapsed"/>
<TextBox x:Name="txtText" Text="{Binding Path=ResultText}" TextWrapping="Wrap" Visibility="Collapsed"/>
<CheckBox x:Name="txtBool" IsChecked="{Binding Path=ResultBool}" Visibility="Collapsed"/>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=CheckDefine.CheckType}" Value="1">
<Setter TargetName="txtBool" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=CheckDefine.CheckType}" Value="2">
<Setter TargetName="txtText" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=CheckDefine.CheckType}" Value="3">
<Setter TargetName="txtNum" Property="Visibility" Value="Visible" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>

注:

从xaml中可知:ListView的ItemsSource绑定了CheckRecords集合,

ListView的第二列的CellTemplate里是一Grid里有两个TextBox和一个CheckBox控件,

三个控件分别绑定到了CheckRecord类的三个不同类型的属性,且三个控件都默认是不可见的。

在DataTemplate.Triggers中绑定了三个DataTrigger,且都绑定到了CheckDefine.CheckType这个属性,

从而根据CheckDefine.CheckType的值来决定三个控件中哪个控件可见(Visibility="Visible")

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;
using System.Collections.ObjectModel;
using DataTriggerDemo.Models; namespace DataTriggerDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private ObservableCollection<CheckRecord> checkRecords;
/// <summary>
/// 生产前的检查记录集合
/// </summary>
public ObservableCollection<CheckRecord> CheckRecords
{
get
{
if (checkRecords == null)
{
checkRecords = new ObservableCollection<CheckRecord>();
}
return checkRecords;
}
}
public MainWindow()
{
InitializeComponent();
GetData();
} private void GetData()
{
CheckRecord c1 = new CheckRecord
{
CheckId=Guid.NewGuid(),
CheckDefine = new CheckDefine
{
CheckDefineId=Guid.NewGuid(),
SeqNo=,
CheckItem = "操作间已清场合格,并在有效期内。",
CheckType=
} };
CheckRecords.Add(c1); CheckRecord c2 = new CheckRecord
{
CheckId = Guid.NewGuid(),
CheckDefine = new CheckDefine
{
CheckDefineId = Guid.NewGuid(),
SeqNo = ,
CheckItem = "操作间已清洁,并无上次生产遗留物;无与本次生产无关文件。",
CheckType =
} };
CheckRecords.Add(c2); CheckRecord c3 = new CheckRecord
{
CheckId = Guid.NewGuid(),
CheckDefine = new CheckDefine
{
CheckDefineId = Guid.NewGuid(),
SeqNo = ,
CheckItem = "所用设备、容器具已清洁消毒,且无上批次生产遗留物;已更换干净的抹布。",
CheckType =
} };
CheckRecords.Add(c3); CheckRecord c4 = new CheckRecord
{
CheckId = Guid.NewGuid(),
CheckDefine = new CheckDefine
{
CheckDefineId = Guid.NewGuid(),
SeqNo = ,
CheckItem = "所用的计量器具符合要求,在检验有效期内。",
CheckType =
} };
CheckRecords.Add(c4); CheckRecord c5= new CheckRecord
{
CheckId = Guid.NewGuid(),
CheckDefine = new CheckDefine
{
CheckDefineId = Guid.NewGuid(),
SeqNo = ,
CheckItem = "所用物料合格且标签相关信息与指令要求相一致:使用的文件与记录已备案。",
CheckType =
} };
CheckRecords.Add(c5); CheckRecord c6 = new CheckRecord
{
CheckId = Guid.NewGuid(),
CheckDefine = new CheckDefine
{
CheckDefineId = Guid.NewGuid(),
SeqNo =,
CheckItem = "操作间环境符合要求(温度18~26°C,湿度45~65%)。",
CheckType =
} };
CheckRecords.Add(c6); CheckRecord c7= new CheckRecord
{
CheckId = Guid.NewGuid(),
CheckDefine = new CheckDefine
{
CheckDefineId = Guid.NewGuid(),
SeqNo = ,
CheckItem = "所用设备完好,试运转正常;设备操作人员均持证上岗。",
CheckType =
} };
CheckRecords.Add(c7);
}
}
}

运行效果:

wpf之数据触发器DataTrigger的更多相关文章

  1. WPF之数据触发器 改变控件背景色或闪烁

    需求,很多矩形表示桶,其中:空桶=红色,满桶=绿色,使用中=红绿闪烁. <Window x:Class="FlickerDemo.MainWindow" xmlns=&quo ...

  2. wpf之DataTrigger 数据触发器

    wpf中,根据数据的值的不同,UI的界面随之改变(显示控件.隐藏控件以及改变控件的其它属性), 这时我们可以用DataTrigger数据触发器. 下面两个案例实现同样的功能,当条件(数据的值)不同时, ...

  3. WPF 精修篇 数据触发器

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

  4. [WPF系列]-数据邦定之DataTemplate 根据对象属性切换模板

      引言 书接上回[WPF系列-数据邦定之DataTemplate],本篇介绍如何根据属性切换模板(DataTemplate)   切换模板的两种方式:   使用DataTemplateSelecto ...

  5. wpf中的触发器详解

    原文 http://zwkufo.blog.163.com/blog/static/25882512009724113250883/ 7.1.2 简单逻辑的表示--触发器(1) 在本章的多处介绍中都会 ...

  6. WPF中的触发器简单总结

    原文 http://blog.sina.com.cn/s/blog_5f2ed5cb0100p3ab.html 触发器,从某种意义上来说它也是一种Style,因为它包含有一个Setter集合,并根据一 ...

  7. wpf中的触发器详解 (转自 乂乂的日志 - 网易博客)

    2010-03-24 16:19:07|  分类: WPF相关 |  标签: |字号大中小 订阅     wpf中的触发器详解 WPF/C# 2009-08-24 11:32:50 7.1.2  简单 ...

  8. 【WPF】数据验证

    原文:[WPF]数据验证 引言      数据验证在任何用户界面程序中都是不可缺少的一部分.在WPF中,数据验证更是和绑定紧紧联系在一起,下面简单介绍MVVM模式下常用的几种验证方式. 错误信息显示 ...

  9. WPF DataTrigger数据触发器

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

随机推荐

  1. Ubuntu下NFS,TFTP服务搭建

    环境:Ubuntu 一. 搭建NFS服务器 (1)安装: sudo apt-get install nfs-kernel-server   #安装NFS服务器端 sudo apt-get instal ...

  2. 第七十五节,CSS表格与列表

    CSS表格与列表 学习要点: 1.表格样式 2.列表样式 3.其他功能 一.表格样式 表格有五种独有样式,样式表如下:             属性               值           ...

  3. get与post 获取参数值的方式

    get方式  参数带在url后面,form表单中的域  可以 没有value 属性, 后台可以直接在方法的参数中加入和url一样的参数就能直接获得该参数的值(效率高,不安全) post方式 url链接 ...

  4. Java 相关注意事项小结

    程序是一系列有序指令的集合: Java主要用于开发两类程序: 1)桌面应用程序2)Internet应用程序1,Java程序:三步走,编写--编译--运行:2,使用记事本开发:1)以.java为后缀名保 ...

  5. if语句—交互程序二

    参考:<笨方法学Python>—习题31 用了两个嵌套的if语句! # coding: utf-8 print u"欢迎来到玩家国度, 你需要根据提示完成闯关!" # ...

  6. matlab里的nargin

    nargin是用来判断输入变量个数的函数,这样就可以针对不同的情况执行不同的功能.

  7. onbeforeunload与a标签在IE中的冲突bug(转载)

    onbeforeunload与a标签在IE中的冲突bug   onbeforeunload 是window的一个事件,目前Firefox,IE都支持,主要用来提示用户是否真的要离开该页面,通常在一些比 ...

  8. HTML+CSS D09 定位

    1.定位 (1)相对定位 如果对一个元素进行相对定位,它将出现在它所在的位置上.然后,可以通过设置垂直或水平位置,让这个元素“相对于”它的起点进行移动. #box_relative {  positi ...

  9. void与void*详解

    void关键字的使用规则: 1. 如果函数没有返回值,那么应声明为void类型: 2. 如果函数无参数,那么应声明其参数为void: 3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void ...

  10. [转]html 移动互联网终端的javascript touch事件,touchstart, touchend, touchmove

    前言 如果我们允许用户在页面上用类似桌面浏览器鼠标手势的方式来控制WEB APP,这个页面上肯定是有很多可点击区域的,如果用户触摸到了那些可点击区域怎么办呢??诸如智能手机和平板电脑一类的移动设备通常 ...