AvalonEdit中的双向绑定不起作用我在我的项目中使用AvalonEdit,它基于WPF和MVVM。阅读这篇文章后,我创建了以下类:publicclassMvvmTextEditor:TextEditor,INotifyPropertyChanged{publicstaticDependencyPropertyDocumentTextProperty=DependencyProperty.Register("DocumentText",typeof(string),typeof(MvvmTextEditor),newPropertyMetadata((obj,args)=>{MvvmTextEditortarget=(MvvmTextEditor)obj;target.DocumentText=(string)args.NewValue;}));publicstringDocumentText{get{returnbase.Text;}set{base.Text=value;}}protectedoverridevoidOnTextChanged(EventArgse){RaisePropertyChanged("DocumentText");base.OnTextChanged(e);}公共事件PropertyChangedEventHandlerPropertyChanged;publicvoidRaisePropertyChanged(stringinfo){if(PropertyChanged!=null){(PropertyChanged!PropertyChangedEventArgs(info));}}}并使用以下XAML来使用此控件:但是绑定是单向的,不会更新我的字符串属性,也不会运行验证规则。如何修复绑定以按预期双向工作?WPF绑定不使用您的DocumentText属性;相反,他们直接访问依赖属性的基础值。OnTextChanged方法实际上并不更改基础依赖属性的值。您需要在每次更改时将base.Text的值复制到依赖项属性中:base.OnTextChanged(e);如果你正确地按照模式来实现DependencyProperty将更容易看到这个问题:DocumentText属性应该使用GetValue/SetValue方法而不是访问其他后备存储。即使使用GetValue和SetValue,也无法在文本更改时让TextProperty更新绑定,因此无论如何您都必须遵循Daniel的回答。我确实做了一些更改,使最终用户必须将Text用作正常和依赖模式时更加直观:publicnewstringText{get{return(string)GetValue(TextProperty);}set{SetValue(TextProperty,value);}}内部字符串baseText{get{returnbase.Text;}set{base.Text=value;}}publicstaticDependencyPropertyTextProperty=DependencyProperty.Register("Text",typeof(string),typeof(MvvmTextEditor),//绑定更改回调:设置底层属性的值newPropertyMetadata((obj,args)=>{MvvmTextEditortarget=(MvvmTextEditor)obj;if(target.baseText!=(string)args.NewValue)//避免撤销堆栈溢出target.baseText=(string)args.NewValue;}));protectedoverridevoidOnTextChanged(EventArgse){SetCurrentValue(TextProperty,baseText);RaisePropertyChanged("文本");base.OnTextChanged(e);我必须检查相同的文本是否已经存在以避免撤消堆栈引擎异常。性能方面也很划算。我尝试根据上面的答案对代码进行轻微修改,因为绑定对我不起作用。以下内容应允许双向绑定。以上就是C#学习教程:AvalonEdit中的双向绑定不起作用分享的所有内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注——publicstaticreadonlyDependencyPropertyMyContentProperty=DependencyProperty.Register("MyContent",typeof(string),typeof(MyTextEditor),newPropertyMetadata("",OnMyContentChanged));privatestaticvoidOnMyContentChanged(objectsender,DependencyPropertyChangedEventArgse){varcontrol=(MyTextEditor)sender;if(string.Compare(control.MyContent,e.NewValue.ToString())!=0){//避免撤销堆栈溢出control.MyContent=e.NewValue.ToString();}}publicstringMyContent{get{returnText;}设置{文本=值;}}protectedoverridevoidOnTextChanged(EventArgse){SetCurrentValue(MyContentProperty,Text);base.OnTextChanged(e);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
