WPF之AvalonEdit实现MVVM双向绑定
AvalonEdit简介
AvalonEdit是基于WPF开发的代码显示控件,默认支持多种不同语言的关键词高亮,并且可以自定义高亮配置。所以通过AvalonEdit可以快速开发出自己想要的代码编辑器。
通过Nuget安装AvalonEdit,并在页面添加控件
<avalonEdit:TextEditor
xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit"
Name="TextEditor"
SyntaxHighlighting="C#"
FontFamily="Consolas"
FontSize="14"
WordWrap ="True"
LineNumbersForeground="#FF2B91AF"
ShowLineNumbers="True">
<avalonEdit:TextEditor.Options>
<avalonEdit:TextEditorOptions ShowSpaces="True" WordWrapIndentation="4" InheritWordWrapIndentation="true">
<avalonEdit:TextEditorOptions.ColumnRulerPosition>
<system:Int32>10</system:Int32>
</avalonEdit:TextEditorOptions.ColumnRulerPosition>
</avalonEdit:TextEditorOptions>
</avalonEdit:TextEditor.Options>
</avalonEdit:TextEditor>
参数含义
xmlns:avalonEdit:命名空间,也可以直接写在调用该控件的窗体内SyntaxHighlighting:设置高亮ShowLineNumbers:是否显示行号LineNumbersForeground:设置编辑器行号颜色ShowSpaces:是否显示空格WordWrapIndentation:换行缩进距离InheritWordWrapIndentation:是否继承上一行的换行缩进
自定义高亮配置
比如AvalonEdit默认支持的sql语法高亮不够强大或者不符合要求,可以自定义配置注册进行。
首先,在项目中引入一个.xshd文件,具体规则可以参考官网介绍。这里提供一个sql.xshd文件,描述了对SQL语法的高亮支持。
在程序启动的时候读取该配置文件,并注册到AvalonEdit中。
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name + ".sql.xshd"))
{
using (var reader = new System.Xml.XmlTextReader(stream))
{
var sqlDefinition = HighlightingLoader.Load(reader, HighlightingManager.Instance);
HighlightingManager.Instance.RegisterHighlighting("SQL", new string[] { ".sql" }, sqlDefinition);
}
}
ps:这里是将sql.xshd的生成操作设置为了嵌入的资源,也可以将其输出到目录再读取内容。
如果需要在项目运行过程中,切换高亮语法支持,可以这么做
textEditor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinition("SQL");
看下高亮效果:

MVVM绑定AvalonEdit文本内容
当我尝试直接将ViewModel中的字符串直接绑定到Text上时,编辑器就报错了,因为Text属性并不是可以直接绑定的依赖属性。
Object of type 'System.Windows.Data.Binding' cannot be converted to type 'System.String'.
最后鼓捣一通后的解决方案是使用Microsoft.Xaml.Behaviors包(其实是微软以前System.Windows.Interactivity的开源版)。
xaml代码
<avalonEdit:TextEditor Name="TextEditor">
<i:Interaction.Behaviors>
<local:AvalonEditBehaviour InputText="{Binding InputString}"/>
</i:Interaction.Behaviors>
</avalonEdit:TextEditor>
后端代码
public sealed class AvalonEditBehaviour : Behavior<TextEditor>
{
public static readonly DependencyProperty InputTextProperty =
DependencyProperty.Register("InputText", typeof(string), typeof(AvalonEditBehaviour),
new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null));
public string InputText
{
get { return (string)GetValue(InputTextProperty); }
set { SetValue(InputTextProperty, value); }
}
protected override void OnAttached()
{
base.OnAttached();
if (AssociatedObject != null)
{
AssociatedObject.TextChanged += AssociatedObjectOnTextChanged;
}
}
protected override void OnDetaching()
{
base.OnDetaching();
if (AssociatedObject != null)
{
AssociatedObject.TextChanged -= AssociatedObjectOnTextChanged;
}
}
private void AssociatedObjectOnTextChanged(object sender, EventArgs eventArgs)
{
var textEditor = sender as TextEditor;
if (textEditor != null)
{
if (textEditor.Document != null)
{
InputText = textEditor.Document.Text;
}
}
}
}
最后看一下实际效果吧

项目Demo:https://github.com/fxhui/DatabaseManagement
WPF之AvalonEdit实现MVVM双向绑定的更多相关文章
- WPF之Treeview实现MVVM双向绑定
Treeview分别有两个数据模板HierarchicalDataTemplate(层级数据模板)和DataTemplate(数据模板),分别应用于生成子数据项和普通数据项. 在使用过程中,如果对两个 ...
- 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...
- 【Maui正式版】创建可跨平台的Maui程序,以及有关依赖注入、MVVM双向绑定的实现和演示
前言:Maui终于在昨天(2022年8月9日)推送出来了.今儿就迫不及待来把玩一下先. A.我本地已有VS2022,不过版本比较老,此处选择更新.工具 -> 获取功能和更新里面,可以获取到新版本 ...
- C#使用Xamarin开发可移植移动应用(3.进阶篇MVVM双向绑定和命令绑定)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...
- C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...
- 仿vue实现简易版mvvm双向绑定
项目地址:https://github.com/pangyongsheng/mvvm 1. 指令 vm-bind 单选数据绑定- 将数据显示到标签视图 vm-model : 双向数据绑定 vm-sho ...
- mvvm双向绑定机制的原理和代码实现
mvvm框架的双向绑定,即当对象改变时,自动改变相关的dom元素的值,反之,当dom元素改变时,能自动更新对象的值,当然dom元素一般是指可输出的input元素. 1. 首先实现单向绑定,在指定对象的 ...
- MVVM双向绑定实现之Object.defineProperty
随着web应用的发展,直接操作dom的应用已渐行渐远,取而代之的是时下越来越流行的MVVM框架,dom操作几乎绝迹,这里面自然是框架底层封装的结果.MVVM框架的双向数据绑定使开发效率大大提高:然后在 ...
- 【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
前言: Wpf开发过程中,最经常使用的功能之一,就是用户控件(UserControl)了.用户控件可以用于开发用户自己的控件进行使用,甚至可以用于打造一套属于自己的UI框架.依赖属性(Dependen ...
随机推荐
- acupuncture
acute+puncture. [woninstitute.edu稻糠亩] To understand the basics of acupuncture, it is best to familia ...
- Spark中的分区方法详解
转自:https://blog.csdn.net/dmy1115143060/article/details/82620715 一.Spark数据分区方式简要 在Spark中,RDD(Resilien ...
- C++构造函数和析构函数初步认识
构造函数 1.构造函数与类名相同,是特殊的公有成员函数.2.构造函数无函数返回类型说明,实际上构造函数是有返回值的,其返回值类型即为构造函数所构建到的对象.3.当新对象被建立时,构造函数便被自动调用, ...
- spring注解-web
以往进行web项目开发都需要在web.xml配置servlet.filter.listener,在Servlet3.0可以通过注解的方式配置它们(注意:必须用tomcat7以上版本) @WebServ ...
- Copy elision in C++
Copy elision (or Copy omission) is a compiler optimization technique that avoids unnecessary copying ...
- Linux 网卡配置文件,命令详细设置
1.配置文件/etc/hosts(本地主机ip地址映射,可以有多个别名)./etc/services(端口号与标准服务之间的对应关系)./etc/sysconfig/network(设置主机名,网关, ...
- 【Python】【Module】hashlib
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 import hashlib # ######## ...
- 【Linux】【Services】任务计划、周期性任务执行
Linux任务计划.周期性任务执行 未来的某时间点执行一次某任务:at, batch 周期性运行某任务:crontab 执行结果:会通过邮件发送给用户 ...
- 观察者模式之spring事件机制
ddsspring中的事件机制使用到设计模式中的观察者模式 ,观察者模式有两个概念,1.观察者.被观察者.2.被观察者做出相应得动作,观察者能接收到.不分析设计模式,学习下spring中的事件机制实际 ...
- DT10功能介绍--DT10多波示波器
功能介绍 有些嵌入式软件方面的问题,利用传统的调试器可能无法解决,而通过逻辑分析器则能有效地解决.请仔细阅读本文, 看我们如何一步一步地讲解在这种情况下所需的配置. 但是,从传统意义上讲,逻辑分析器是 ...