快速业务通道

在Canvas上根据变量改变Shape的位置

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
abel Name="lblX" Content="{Binding Path=RectX}" />

由于Label的Content默认就是 OneWay的,这里就没有显式指定。

接着,两个ScrollBar。跟TextBox相似,也是做了双向绑定。不过ScrollBar的Value不用显式指定UpdateSourceTrigger也行。

Xml代码

<ScrollBar Name="scbX"
  Value="{Binding Path=RectX, Mode=TwoWay}" />

最后是Canvas里的 Rectangle。与Label类似,对RectX和RectY做了单向绑定,分别绑定到Canvas.Left和Canvas.Top这两个附加属性上。

Xml代码

<Rectangle
  Canvas.Left="{Binding Path=RectX}"
  Canvas.Top="{Binding Path=RectY}"/>

OK,到这里为止都是在XAML 里设置数据绑定的目标。那数据源的一侧要如何实现呢?关键问题是,当数据源的值发生了变化,应该如何通知数据绑定的目标?

(不是特别推荐的方法)通过实现INotifyPropertyChanged接口来实现数据源

WPF能理解INotifyPropertyChanged接口,通过其PropertyChanged事件来得到数据源更新的通知。

C#代码

using System.ComponentModel;
using System.Windows;

namespace TestWpfCanvasShapeDataBinding {
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window, INotifyPropertyChanged {

        private int _rectX;
        private int _rectY;

        public int RectX {
            get { return _rectX; }
            set {
                _rectX = value;
                OnPropertyChanged( "RectX" );
            }
        }

        public int RectY {
            get { return _rectY; }
            set {
                _rectY = value;
                OnPropertyChanged( "RectY" );
            }
        }

        public Window1( ) {
            InitializeComponent( );
            this.DataContext = this;
        }

        private void button1_Click( object sender, RoutedEventArgs e ) {
            MessageBox.Show( this.RectX.ToString( ) );
        }

        private void button2_Click( object sender, RoutedEventArgs e ) {
            MessageBox.Show( this.RectY.ToString( ) );
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged( string propertyName ) {
            var handler = PropertyChanged;
            if ( null != handler ) {
                handler( this, new PropertyChangedEventArgs( propertyName ) );
            }
        }

        #endregion
    }
}

实现要点是:

1、实现INotifyPropertyChanged接口,并声明其成员 PropertyChanged事件;

2、定义一个OnPropertyChanged()方法来发送上述事件;不一定要叫 OnPropertyChanged,这只是习惯;

3、在需要通知更新的属性的setter里调用 OnPropertyChanged()。

这种做法在WinForms里应该很常见,因为WinForms的数据绑定支持实在 算不上好。WPF里有更方便更强大的支持,也就是DependencyProperty。

通过 DependencyProperty来实现数据源

DependencyProperty的内部实现机制描述起来觉得好复杂。 我也没理解透彻。所以这里就不多说了,详细还是找本WPF的书来看吧。

自己需要写的代码方面 则很简单,如下:

Window1.xaml.cs

C#代码

using System.Windows;

namespace TestWpfCa

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号