随笔分类 - WPF
摘要:ViewModelBase和CommandBase代码的整理如下:1.ViewModelBase.cs[c-sharp] view plaincopyusingSystem;usingSystem.ComponentModel;usingSystem.Linq.Expressions;///<summary>///WPFMVVC设计模式ViewMode基本功能类///</summary>publicabstractclassViewModelBase:INotifyPropertyChanged,IDisposable{#regionPublicProperties//
阅读全文
摘要:Binding的亮点 在WPF中,Binding无处不在,关于Binding的漂亮用法有很多,其主要的设计亮点有二:Weak Event模式Converter 监听B的属性变化,A需要注册B的PropertyChanged事件,.net中事件是强引用,一旦A注册了B的事件,B就持有了一个A的引用。也就是说,如果A不注销B的事件,即使A已经空置,如果B对象存活,垃圾回收器仍不会回收A的内存,在使用中就造成了A的内存泄露。在Binding的使用过程中,可能会出现多级绑定,A->B->C,一个对象也可能绑定多个对象,在对象空置时注销绑定的监听事件是不太现实的,实现起来太过繁琐。这里就期望
阅读全文
摘要:xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"这个命名空间存放的就是XAML和XAML编译器沟通的东西,比如编译时与那个C#代码合并等一、 在XAML中出现的方式有三种1.标签扩展: x:Array, x:Null, x:Static, x:Type2. XAML指令元素: x:Code, x:XData3. Attribute: x:Class, x:ClassModifier, x:FieldModifier, x:Key, x:Name, x: Shared, X:Subclass, x:TypeArgum
阅读全文
摘要:在WPF中。有着两种资源, 一种是组件资源:又被称为程序集资源,以二进制存在编译后的程序集中,通常用于存放图片或其他音频文件. 第二种是对象资源:通常放于xaml中。比如WPF的样式和数据绑定特性. demo地址 http://download.csdn.net/source/3449754 组件资源:和以前的WINFORM 和WEB中的图片资源一样 获取方式:例如在程序中添加了一个图片。可以直接通过下面 在XAML中添加:<Image x:Name="image1"Source="image/Desert.jpg"></Image&g
阅读全文
摘要:我们知道,XAML标签会对应一个实例。如果在XAML里初始化实例的属性,我们有两种语法可以选择:直接使用Attribute="Value"的方法属性元素(Property Element)方法今天我们讨论的核心就是——第一种方法是如何实现的。先看一个例子。我为一个Grid设置了矢量渐变画刷:<Grid><Grid.Background><LinearGradientBrushStartPoint="0,0"EndPoint="1,1"><GradientStopOffset="0&q
阅读全文
摘要:实际编程中,因为我们较多地使用到Binding类的Source与Path,所以可能会有一个思维定式,那就是:有可能作为数据源的类一定要准备好一些属性,这些属性将作为Binding的Path。如果本着这个思想去设计有可能作为数据源的类,那么会有两个问题出现:1. 这个类的哪些属性有可能作为数据源的Path?是都需要激发NotifyPropertyChanged事件,还是用到了再添加?这很有可能让这个类迟迟不能封闭。2. 需要用属性把一些方法包装起来,用来暴露给Binding,造成冗余和语义上的不美观。其实,WPF类库里有一个名为ObjectDataProvider的类就是专门为了解决这个矛盾的—
阅读全文
摘要:让我们分析这样一个需求——UI上有若干个文本框和一个“提交”按钮,这些文本框都是用户必须填写的,如果不都填写,提交按钮是不可用的。习惯了使用WinForm的同学可能脑子里已经开始飞速地搜寻使用Event来解决的方案了。实际上,在WPF里使用多路Data Binding将非常简单。所谓“多路Binding(也可以叫复合Binding)”就是指某个元素的Dependency Property的值不是由单一的数据源来决定,而是由多个数据源(通过一定逻辑)共同决定的,我们一般会把逻辑写在Converter里。是不是颇有些“脚踩N条船”的意思?多路Binding使用的类是MultiBinding类,这个
阅读全文
摘要:上篇文已经说明,Binding就是数据源与目标之间的“关联”。大多数情况下,数据从Source到Target以及从Target返回Source都是“直来直去”的,但有些场景却需要我们对数据做些转换才能为我所用。举两个典型的例子:如果数据源里的值是Y和N,如果是Y,那么UI上的CheckBox就被勾选,否则就不勾选,这就需要我们把string(也许是char)类型的数据转换成bool?类型再使用。如果Binding是TwoWay的,CheckBox的勾选操作还会把值传回数据源。如果“评论内容”TextBox里没有内容,则“提交”Button不可以点击。这是个典型的OneWay数据Binding,
阅读全文
摘要:如果用一句话概括前几篇关于data binding的文章,那就是:介绍了数据驱动(界面)开发的基本原理,以及如何使用Binding类的实例连接数据源与数据表现元素、形成一对一的binding(为了让数据有效、安全,我们还可以添加Converter和ValidationRule等附件)。注意啦,我强调了一下——是一对一的binding哦!也就是说,一个binding实例一端是数据源、一端是表现元素。现在问题来了:实际工作中,我们操作的大部分数据都是集合,怎么进行“群体binding”呢?呵呵,这就引出了我们今天的第一个topic——对集合进行binding。集合Binding揭秘我们想这样一个问
阅读全文
摘要:让我们了解Data Binding的几个关键概念了——数据源(Data Source,简称Source):顾名思义,它是保有数据的实体、是数据的来源、源头。把谁当作数据源完全由程序员来决定——只要你想把它当做数据核心来使用。它可以是一个UI元素、某个类的实例,也可以是一个集合(关于对集合的绑定,非常重要,专门用一篇文章来讨论之)。路径(Path):数据源作为一个实体可能保有着很多数据,你具体关注它的哪个数值呢?这个数值就是Path。就上面的例子而言,slider1是Source,它拥有很多数据——除了Value之外,还有Width、Height等,但都不是我们所关心的——所以,我们把Path设
阅读全文
摘要:要绑定的数据结构如下,一个Category包含多个SubCategory:public class Category { public string Name { get; set; } public ObservableCollection<SubCategory> SubCategories { get; set; } } public class SubCategory { public int Id { get; set; } public string SubCategoryName { get; set...
阅读全文
摘要:在WPF中,TreeView默认情况是不支持右键选定的,也就是说,当右键点击某节点时,是无法选中该节点的。当我们想在TreeViewItem中实现右键菜单时,往往希望在弹出菜单的同时选中该节点,以使得菜单针对选中的节点生效。 图1:虽然是在GNU节点上弹出的右键菜单,但选中的节点仍然是上次左键单击的DOC节点。 图2:弹出的右键菜单同时选中GNU节点才是我们所需要的效果 实现这个功能并不是很难,我最开始的做法就是目前网上流行的版本: 在TreeViewItem中响应PreviewMouseRightButtonDown事件 在响应右键单击事件前选中sender(TreeViewItem)节..
阅读全文