当前位置: 首页 > news >正文

gif图标网站深圳网站建设的基本知识

gif图标网站,深圳网站建设的基本知识,国外做二手服装网站有哪些问题,织梦 更换网站图标序言 借助WPF/Sliverlight强大的数据绑定功能#xff0c;可以比实现比MFC#xff0c;WinForm更加优雅轻松的数据绑定。但是在使用WPF/Silverlight绑定时#xff0c;有件事情是很苦恼的#xff1a;当ViewModel对象放生改变#xff0c;需要通知UI。我们可以让VM对象实现INot…序言 借助WPF/Sliverlight强大的数据绑定功能可以比实现比MFCWinForm更加优雅轻松的数据绑定。但是在使用WPF/Silverlight绑定时有件事情是很苦恼的当ViewModel对象放生改变需要通知UI。我们可以让VM对象实现INotifyPropertyChanged接口通过事件来通知UI。但问题就出现这里…… 一描述问题 情形现在需要将一个Person对象的Name熟悉双向绑定到UI中的TextBox的确这是一件很简单的事情但还是描述下 XAML TextBox Text{Binding Name,ModeTwoWay}/ C# Code public class Person : INotifyPropertyChanged{private string m_Name;public string Name{get { return m_Name; }set {if (m_Name value) return; m_Name value;this.Notify(Name);}}public Person(){this.m_Name 墨梅在这里......;}public event PropertyChangedEventHandler PropertyChanged;public void Notify(string propertyName){PropertyChangedEventHandler handler this.PropertyChanged;if (handler ! null)handler(this, new PropertyChangedEventArgs(propertyName));}} 是的这就可以实现了。但是这里一个问题困惑我曾经就在this.Notify(Name)将参数写错UI迟迟得不到响应。这个错误很难发现也很难跟踪但是这个细微的错误可以导致一个很严重的运行时错误。这的确是一件很苦恼的事情。 二解决问题 方法一添加验证 public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName) {this.VerifyPropertyName(propertyName);PropertyChangedEventHandler handler this.PropertyChanged;if (handler ! null){var e new PropertyChangedEventArgs(propertyName);handler(this, e);} }[Conditional(DEBUG)] [DebuggerStepThrough] public void VerifyPropertyName(string propertyName) {// Verify that the property name matches a real, // public, instance property on this object.if (TypeDescriptor.GetProperties(this)[propertyName] null){string msg Invalid property name: propertyName;if (this.ThrowOnInvalidPropertyName)throw new Exception(msg);elseDebug.Fail(msg);} } 这里对验证事件参数使用条件编译[Conditional(“DEBUG”)],在release版本中这个函数是不会调用的比使用#if 等有更明显有优势。 这个方法虽然可以达到目的但是还是那么的别扭必须到运行时才能知道是否有错误所以还是不怎么好。 方法二使用Lambda表达式静态扩展语法 public static class NotificationExtensions{public static void Notify(this PropertyChangedEventHandler eventHandler, ExpressionFuncobject expression){if( null eventHandler ){return;}var lambda expression as LambdaExpression;MemberExpression memberExpression;if (lambda.Body is UnaryExpression){var unaryExpression lambda.Body as UnaryExpression;memberExpression unaryExpression.Operand as MemberExpression;}else{memberExpression lambda.Body as MemberExpression;}var constantExpression memberExpression.Expression as ConstantExpression;var propertyInfo memberExpression.Member as PropertyInfo;foreach (var del in eventHandler.GetInvocationList()){del.DynamicInvoke(new object[] {constantExpression.Value, new PropertyChangedEventArgs(propertyInfo.Name)});}}} 这里用使用的静态扩展语法我还是比较喜欢这个的但是并不是所有人都喜欢哦。如何使用呢 public class Employee : INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;private string _firstName;public string FirstName {get { return this._firstName; }set{this._firstName value;this.PropertyChanged.Notify(()this.FirstName);}}} 这里还可以添加一个很实用的扩展 public static void SubscribeToChangeT(this T objectThatNotifies, ExpressionFuncobject expression, PropertyChangedEventHandlerT handler)where T : INotifyPropertyChanged{objectThatNotifies.PropertyChanged (s, e) {var lambda expression as LambdaExpression;MemberExpression memberExpression;if (lambda.Body is UnaryExpression){var unaryExpression lambda.Body as UnaryExpression;memberExpression unaryExpression.Operand as MemberExpression;}else{memberExpression lambda.Body as MemberExpression;}var propertyInfo memberExpression.Member as PropertyInfo;if(e.PropertyName.Equals(propertyInfo.Name)){handler(objectThatNotifies);}};} 通过上面的代码可以订阅熟悉改变事件,如 myObject.SubscripeToChange(()myObject.SomeProperty,SomeProperty_Changed); And then your handler would look like this:private void SomeProperty_Changed(MyObject myObject) {/* ... implement something here */ } 方法三net4.5框架提供的解决方法 private string m_myProperty; public string MyProperty {get { return m_myProperty; }set{m_myProperty value;OnPropertyChanged();} }private void OnPropertyChanged([CallerMemberName] string propertyName none passed) {// ... do stuff here ... } 属性CallerMemberName的解决办法和方法二是基本相同的不同的是这个在net框架中解决的。更多信息可以查看CallerMemberNamenet4.5还提供了 CallerFilePathCallerLineNumber这几很有用的语法 方法四这个也不错哦 public static class SymbolExtensions{public static string GetPropertySymbolT,R(this T obj, ExpressionFuncT,R expr){return ((MemberExpression)expr.Body).Member.Name;}}public class ConversionOptions : INotifyPropertyChanged{private string _outputPath;public string OutputPath{get { return _outputPath;}set{_outputPath value;OnPropertyChanged(o o.OutputPath);}}private string _blogName;public string BlogName{get { return _blogName;}set{_blogName value;OnPropertyChanged(o o.BlogName);}}private string _secretWord;public string SecretWord{get { return _secretWord; }set{_secretWord value;OnPropertyChanged(o o.SecretWord);}}protected virtual void OnPropertyChangedR(ExpressionFuncConversionOptions, R propertyExpr){OnPropertyChanged(this.GetPropertySymbol(propertyExpr));}protected virtual void OnPropertyChanged(string propertyName){if (PropertyChanged ! null)PropertyChanged(this, new PropertyChangedEventArgs(propertyName));}public event PropertyChangedEventHandler PropertyChanged;} 注释这里还有更多参考信息您可以在这里了解更加清楚
http://www.zqtcl.cn/news/568107/

相关文章:

  • 湘潭网站建设价格最新新闻热点事件100字
  • 音乐网站程序源码wordpress模板中文版
  • 网站建设计划表wordpress主题 大
  • 在手机制作网站书店网站建设技术风险
  • 爱站网域名查询wordpress自定义标题关键词描述
  • 西安学校网站建设报价建盏
  • 网页 网站 区别东莞手机app开发
  • 空压机网站开发公司广州海珠区有什么好玩的景点
  • 什么网站可以做期货企业解决方案服务协议
  • 西安汽车网站制作手机软件制作网站平台
  • 微信的微网站介绍自己的家乡遵义网站建设
  • 爱站seo东莞网站建设要注意什么
  • 惠州网站建设 英语6wordpress 表格提交
  • 做网站15年多少钱一度电
  • 北京网站域名快速备案外贸网站优化价格
  • 做网站 工资高吗免费建站的站点网站
  • 个人做营利性质网站会怎么样qq邮箱官方网站
  • 网站怎么做等级保护产品展示小程序
  • 奉贤网站建设专家高端自适应网站设计
  • 网站正在建设中 动态徐州网站建设方案咨询
  • 广东世纪达建设集团有限公司官方网站专业电商网站开发
  • 抚顺建设网站自适应网站建设推荐
  • 做网站的大公司手机页面
  • 网站建设的公司实习做什么系统设计
  • 兰州网站设计哪个平台好外贸网站定制公司哪家好
  • 做网站需要先买域名吗在线音乐网站开发数据库
  • 深圳优化网站搬家网站模板
  • 网站建设做的人多吗门户网站制作建设
  • 哪个网站可以做logo怀柔网页公司制作
  • 网站被抄袭怎么投诉网站建设丨金手指15