- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想将 AvalonEdit TextEditor
控件包含到我的 MVVM 应用程序中。我需要的第一件事是能够绑定(bind)到 TextEditor.Text
属性,以便我可以显示文本。为此,我遵循了 Making AvalonEdit MVVM compatible 中给出的示例。 .现在,我已经使用接受的答案作为模板实现了以下类
public sealed class MvvmTextEditor : TextEditor, INotifyPropertyChanged
{
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(MvvmTextEditor),
new PropertyMetadata((obj, args) =>
{
MvvmTextEditor target = (MvvmTextEditor)obj;
target.Text = (string)args.NewValue;
})
);
public new string Text
{
get { return base.Text; }
set { base.Text = value; }
}
protected override void OnTextChanged(EventArgs e)
{
RaisePropertyChanged("Text");
base.OnTextChanged(e);
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string info)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
XAML 在哪里
<Controls:MvvmTextEditor HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
FontFamily="Consolas"
FontSize="9pt"
Margin="2,2"
Text="{Binding Text, NotifyOnSourceUpdated=True, Mode=TwoWay}"/>
首先,这是行不通的。 Binding 根本没有显示在 Snoop 中(不是红色,什么都没有,事实上我什至看不到 Text
依赖属性)。
我看到这个问题和我的一模一样Two-way binding in AvalonEdit doesn't work但接受的答案不 有效(至少对我而言)。所以我的问题是:
如何使用上述方法执行双向绑定(bind)以及我的 MvvmTextEditor
类的正确实现是什么?
感谢您的宝贵时间。
注意:我的 ViewModel 中有我的 Text
属性,它实现了所需的 INotifyPropertyChanged
接口(interface)。
最佳答案
创建一个将附加 TextChanged 事件的行为类,并将连接绑定(bind)到 ViewModel 的依赖属性。
AvalonTextBehavior.cs
public sealed class AvalonEditBehaviour : Behavior<TextEditor>
{
public static readonly DependencyProperty GiveMeTheTextProperty =
DependencyProperty.Register("GiveMeTheText", typeof(string), typeof(AvalonEditBehaviour),
new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, PropertyChangedCallback));
public string GiveMeTheText
{
get { return (string)GetValue(GiveMeTheTextProperty); }
set { SetValue(GiveMeTheTextProperty, 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)
GiveMeTheText = textEditor.Document.Text;
}
}
private static void PropertyChangedCallback(
DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
var behavior = dependencyObject as AvalonEditBehaviour;
if (behavior.AssociatedObject!= null)
{
var editor = behavior.AssociatedObject as TextEditor;
if (editor.Document != null)
{
var caretOffset = editor.CaretOffset;
editor.Document.Text = dependencyPropertyChangedEventArgs.NewValue.ToString();
editor.CaretOffset = caretOffset;
}
}
}
}
View.xaml
<avalonedit:TextEditor
WordWrap="True"
ShowLineNumbers="True"
LineNumbersForeground="Magenta"
x:Name="textEditor"
FontFamily="Consolas"
SyntaxHighlighting="XML"
FontSize="10pt">
<i:Interaction.Behaviors>
<controls:AvalonEditBehaviour GiveMeTheText="{Binding Test, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</i:Interaction.Behaviors>
</avalonedit:TextEditor>
i
必须定义为
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
ViewModel.cs
private string _test;
public string Test
{
get { return _test; }
set { _test = value; }
}
这应该会为您提供文本并将其推送回 ViewModel。
关于c# - 使用 MVVM 绑定(bind)到 AvalonEdit 文档文本的两种方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18964176/
我想在双击鼠标时突出显示所选单词的所有出现。这个问题Highlight all occurrences of selected word in AvalonEdit确实回答了如何使用 Document
我在使用AvalonEdit控件,而xshd-ruleset(对于tex)有一个小问题: 原始文件“ Mike Krueger的TeX文档2001的语法定义(由Jedit搜集)”中有关于特殊关键字的部
有没有办法在 AvalonEdit 文本编辑器中捕获粘贴事件,以便可以修改数据? 我们让用户粘贴 Excel 中的数据,并且出于某种原因,数据显示时带有一个额外的换行符。这意味着如果他们在块选择时粘贴
当我使用 avalonedit 开发自定义语言 IDE 时,我遇到了一个问题。我使用正则表达式来检查语法,它按设计工作。但是,我想用波浪文本标记显示语法错误。我确实在 google 上搜索过,但该解决
我无法将字符插入到我的 AvalonEdit TextEditor 中。 void editor_TextArea_TextEntered(object sender, TextComposition
实际上这是在 http://community.sharpdevelop.net/forums/p/21949/56153.aspx#56153 上被问到的但还没有答案 - 所以我在这里试试。 我在
如何检查某个位置的单词是否在 xshd-ruleset 的 Span[i] 中? 谢谢! 最佳答案 有两种可能的方式从高亮引擎获取信息: 突出显示引擎仅在每行的开头存储“跨度堆栈”。您可以使用 Doc
对于 AvalonEdit,我在 xshd 文件中定义了“注释”。现在,在我的程序中,我想确定给定的偏移量是在注释内部还是外部。 我确实在网上找到了一些代码,即: http://community.s
我正在使用 AvalonEdit 为补丁文件创建一个 View ,我想让它在整行中突出显示差异,而不仅仅是文本背景 - 类似于 GitHub for Windows 今天所做的: 我是 AvalonE
我尝试获取 avalonedit 控件的可见文本,但 VisualLines[] 仅使用 TextLines[] 处理自动换行,我不知道如何检查是否TextLine是否在可见区域。 如果我可以在 Te
我有一种简单的“语言”(类似于模板语言和简单的标记语言,如 BBcode — 基本上它只是带有一些变量、标签和类似功能的普通文本),我想强调它的语法。 这是我坚持的事情。 有变量,它们用$ 符号括起来
我目前将以下代码用作带有 AvalonEdit TextEditor 的 LineTransformer。我希望能够通过选择突出显示当前的单个搜索结果,但是该选择几乎不可见,因为 DocumentCo
我在让 AvalonEdit TextEditor 滚动到特定行时遇到了很多麻烦。 ScrollTo() 的行为只是滚动直到该行位于 View 中间。我尝试了很多在互联网上找到的不同方法,所以喜欢用
在 Avalonedit 中,如何获取用户可见的最顶行的行号? 我相信我应该使用 VisualLines,但它没有帮助。 最佳答案 您可以使用GetDocumentLineByVisualTop: i
有没有简单的方法使用 Avalon edit 来突出显示匹配的括号和其他字符,如 {}""? 最佳答案 AvalonEdit 无法自行完成 - 您必须自己编写该功能。 您必须自己找到匹配的括号(如果您
我正在使用 AvalonEdit,我希望用户始终能够看到插入符在哪一行,即使编辑器没有焦点。为此,我找到并改编了一些代码,这些代码使用 BackgroundRenderer 来突出显示当前行的背景。
我想实现一些在提供文档行时以编程方式更改文本背景的东西。(看起来非常类似于文本的 block 选择的东西。我将使用它来调试 IDE 的断点我在设计)。我不想使用选择,因为它会导致文本框滚动。 我想我需
我已将派生自 DocumentColorizingTransformer 的 LineTransformerClass 添加到 TextEditor: TxtEditCodeViewer.TextAr
我想在我的代码中更改 AvalonEdit 的语法突出显示。 XAML: C#: public string syntaxHighlighting { get; set; } public Mai
我想级联 AvalonEdit 的 SyntaxHighlighting Engine。我有 2 个 HighlightingDefinitions。第一个是主要语法。第二个是复杂的多行预处理器标记语
我是一名优秀的程序员,十分优秀!