WPF数据绑定点滴1,2,3

在WPF程序设计中数据绑定非常常用,这个功能使用得当可以大幅的简化程序逻辑,提高效率,如下根据使用中的情况简要做了总结。

概念

数据绑定发生在源对象和目标对象之间,当源对象或目标对象的属性值发生改变时,所绑定的对象也会跟着发生改变
         * 数据绑定的目标对象一定是Dependency Object,所绑定的目标对象的属性一定是Dependency Property
         * 源对象可以是Dependency Object/Dependency Property,也可以是一般的.net对象

绑定模式:

         *  OneWay:源对象发生改变时,目标对象也跟着改变;目标对象发生改变时,源对象不变化
         *  TwoWay:源对象发生改变时,目标对象也跟着改变;目标对象发生改变时,源对象也跟着变化
         *  OneTime:只在初始化时发生作用,数据从源对象传递到目标对象
         *  OneWayToSource:和OneWay类似,不同的是源对象随着目标对象的变化而变化
         *  Default:源对象的属性如果是只读的,选择为OneWay;如果源对象的属性是读写的,选择为TwoWay,大多的情况 适用
      对象是否实现了INotifyPropertyChanged,是选择绑定的依据
【初次使用常迷惑的问题是,绑定的.net对象修改时,而目标不变化,此时主要的问题是一般的.net对象没有实现INotifyPropertyChanged的原因;对于集合的绑定也类似,可以使用ObservableCollection <T>这个容器类构造集合辅助处理】

Binding.Path

绑定的路径设置,可以选择各种形式,从属性、数组、XPath等等

MSDN有详细说明: http://msdn.microsoft.com/zh-cn/library/system.windows.data.binding.path.aspx 

///Binding.Path Property 的类型
///Path=PropertyName
///Path=ShoppingCart.Order
///Path=(DockPanel.Dock).
///Path=ShoppingCart.ShippingInfo[MailingAddress,Street]
///Path="[(sys:Int32)42,(sys:Int32)24]"
///Path=/
///Path=/Offices/ManagerName
///Path=.

基本使用例子

        <!--界面对象之间的绑定-->        <ScrollBar Name="scroll"  Orientation ="Horizontal " Margin ="24"               Maximum ="100" LargeChange ="10" SmallChange ="1"/>

        <TextBox Name="txtScrollvalue"/>        <TextBox Text="{Binding ElementName=scroll, Path=Value}"/>        <TextBox>            <TextBox.Text>                <Binding ElementName="scroll" Path="Value"/>            </TextBox.Text>        </TextBox>
 
        <!--绑定时刻:控制更新的时刻-->        <TextBox Text="{Binding ElementName=scroll, Path=Value, UpdateSourceTrigger=PropertyChanged}"/>
        <!--DataContext形式绑定-->        <StackPanel Name="objectBind">            <TextBox Text="{Binding Path=FirstName, Mode=OneWay}"/>            <TextBox Text="{Binding Path=LastName}"/>            <ListBox  ItemsSource="{Binding Path=Address}" Height="50" Width="380"   IsSynchronizedWithCurrentItem ="True" />            <ComboBox  Name="phs" ItemsSource="{Binding Path=Phones}" DisplayMemberPath="Mobile" Height="20" Width="380"/>                        <TextBox Text="{Binding Path=Phones[0].Mobile}"/>        </StackPanel>
如下是对应如上的代码
this.person = new Person("joe", "bill"){    Address = new List<string>() { "Beijing", "China" },    Phones = new List<Phones>()    {        new Phones(){ Mobile="131", Phone="112"},        new Phones(){ Mobile="132", Phone="110"}    },};this.person.RecentPohne = this.person.Phones[1]; 

this.objectBind.DataContext = this.person;

 

类型转换

对于绑定中设置的不同类型很常用,如我们常见的日期的显示等都可以采用这种形式转换为符合自己需要的形式

        <StackPanel.Resources>            <local:NumberConvert  x:Key="cvt"/>        </StackPanel.Resources>
        <!--绑定类型转换-->        <TextBox Name="octText" />        <TextBox Text="{Binding ElementName=octText, Path=Text, Converter={StaticResource cvt },ConverterParameter=2 }">        </TextBox>以下是NumberConvert的实现

[ValueConversion(typeof(string), typeof(int))]
public class NumberConvert : IValueConverter
{
    public object Convert(object value, Type typeTarget, object param, CultureInfo culture)
    {
        string inputValue = value.ToString();
        int c;
        int.TryParse(inputValue, out c);
        if (param != null)
        {
            var p = Int32.Parse(param as string);
            c += p;
        }

        return c;
    }

    public object ConvertBack(object value, Type typeTarget, object param, CultureInfo culture)
    {
        int c;
        int.TryParse(value.ToString(), out c);
        if (param != null)
        {
            var p = Int32.Parse(param as string);
            c -= p;
        }

        return c.ToString();
    }
}

 

数据校验

对于绑定的数据如果允许编辑,可以通过数据简要防止不符合要求的数据更新到对象中
        <TextBox Name="validRule" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}">
        <TextBox.Text>
                <Binding Path="Count"  NotifyOnValidationError="true">
                    <Binding.ValidationRules>
                            <local:SelfValidRule Age="100"/>
                    </Binding.ValidationRules>
             </Binding>
        </TextBox.Text>
        </TextBox>

以下是SelfValidRule 的实现

public class SelfValidRule : ValidationRule
   {
       public int Age
       {
           get;
           set;
       }

       public SelfValidRule()
       {
       }

       public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
       {
           int age;
           if (!int.TryParse(value.ToString(), out age))
           {
               return new ValidationResult(false, "输入无效字符!");
           }

           if (age < 0 || age > this.Age)
           {
               return new ValidationResult(false, "太大!");
           }

           return ValidationResult.ValidResult;
       }
   }

复杂数据来源对象的绑定

在复杂的场合,我们可能需要把不同的数据对象绑定到界面元素上,此时我们可以使用如下的一些比较复杂的支持类辅助完成这些工作
         * MultiBinding CompositeCollection PriorityBinding

以上类可参考MSDN的详细解释。

以上例子的详细地址参考:

http://cid-56b433ad3d1871e3.office.live.com/self.aspx/.Public/wpf%5E_binding.rar

时间: 2024-09-24 19:45:13

WPF数据绑定点滴1,2,3的相关文章

WPF and Silverlight学习笔记(二十):WPF数据绑定概述

WPF数据绑定为应用程序提供了一种表示数据和与数据交互的简单而又一致的 方法.元素能够以公共语言运行库 (CLR) 对象和 XML 的形式绑定到各种数据源 中的数据. 一.数据绑定的基本概念: 数据绑定涉及到两个方面 :一个是绑定源,再一个是绑定目标.绑定源即控件绑定所使用的源数据,绑定 目标即数据显示的控件. 1.对于绑定源,在WPF可以是以下四种: CLR对象:可以绑定到CLR类的公开的属性.子属性.索引器上 ADO.Net对象:例如DataTable.DataView等 XML文件:使用X

wpf-急,跪求大神指导WPF数据绑定

问题描述 急,跪求大神指导WPF数据绑定 我在后台的.cs文件中通过事件响应获取了一个对象,我如何在前台.xmal文件中绑定并且使这个对象按照我定义好的DataTemplate把各个属性显示出来,我在.xmal中按照如下方法,可是显示不出来 甚至想直接用显示各个属性的值,也显示不出来. 请各位大神指导哪里出错,怎么改.对象不在.xaml对应的.xaml.cs中,而在同一个project的另一个.cs文件中 解决方案 你是不是忘记在bing数据库源了

wpf数据绑定的深入问题

问题描述 定义一个简单的类,classHuman:INotifyPropertyChanged{publiceventPropertyChangedEventHandlerPropertyChanged;privatestringname;publicstringName{get{returnname;}set{name=value;if(this.PropertyChanged!=null){this.PropertyChanged.Invoke(this,newPropertyChanged

WPF命令介绍、命令和数据绑定集成应用

要开始使用命令,必须做三件事: 一:定义一个命令 二:定义命令的实现 三:为命令创建一个触发器 WPF中命令系统的基础是一个相对简单的ICommand的接口,代码如下: public interface ICommand { event EventHandler CanExecuteChanged; bool CanExecute(object parameter); void Execute(object parameter); } CanExecute用于确定命令是否处于可执行的状态.典型的

WPF中的数据绑定

目录 数据绑定细节 创建简单的绑定 绑定模式 绑定的 时间 绑定到 XML 对象绑定和 DataTemplates 对数据进行排 序 欢迎试用和反馈 到目前为止,很多人都知道使用 Windows Presentation Foundation (WPF) 可以轻松地设计强大的用户界面.但是您可能 并不知道它还提供了强大的数据绑定功能.使用 WPF,可以通过利用 Microsoft .NET Framework 代码.XAML 或两者的组合进行数据操作.您可 以绑定控件.公共属性.XML 或对象,

使用数据绑定和WPF自定义数据显示

本文将介绍以下内容: WPF 数据绑定 数据显示和分层数据 使用模板 输入验证 本文使用以下技术: WPF. XAML.C# 目录 在代码中绑定 使用模板 使用继承的 DataContext 使用集合视图 使用分层数据 使用多个控件显示 XML 数据 使用多个控件显示业务对象 一个用于显示整个层次结构的控件 使 用分层数据模板 使用用户输入 通过 ValidationRules 验证输入 显示验证错误 通过 IDataErrorInfo 验证输入 结束语 在虚拟实验室中进行试验: 当 Windo

WPF中数据绑定的Validation应用分析

本来在写WPF Bug清单系列,但是写到第三篇(突然消失的ListViewItem)的时候发现重现BUG的逻辑 很复杂.而且需要比较多的基础知识,如果不先解释清楚,实在是怕有人用"不用Valiation不就行了" 等回复来砸场子.^_^ 本文从设计和应用的角度对DataBinding的Validation的不足进行了分析,假设读者使用过 DataBinding中的Validation.着重介绍WPF中DataBinding的Validation.有关数据绑定的基础知识请参 考MSDN.

WPF的数据绑定详细介绍_实用技巧

一.WPF数据绑定的概要 数据绑定:是应用程序 UI 与业务逻辑之间建立连接的过程. 如果绑定正确设置并且数据提供正确通知,则当数据的值发生更改时,绑定到数据的视觉元素会自动反映更改. 数据绑定可能还意味着如果视觉元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改. 例如:如果用户编辑 TextBox 元素中的值,则基础数据值会自动更新以反映该更改. 1. 数据绑定涉及到两个方面: 一个是绑定源,一个是绑定目标.绑定源即控件绑定所使用的源数据,绑定目标即数据显示的控件. 2. 对

c#-一条关于wpf的数据绑定的问题

问题描述 一条关于wpf的数据绑定的问题 Text="{Binding ElementName=combobox1,Path=SelectedItem.Content,Mode=OneWay}"> 我这里定义了Combobox和Textbox,并分别命名为combobox1和textbox1,然后我就把TextBox的content属性绑定到Combobox的selectedItem的Content,但是我调试的时候无论Combobox选择了什么项,Textbox的Text都没有