我正在通过遵循this guide来尝试使用Telerik的新RadSyntaxEditor。
这是我创建的代码:
private RadSyntaxEditor _syntaxEditor;
public RadSyntaxEditor SyntaxEditor
{
get => _syntaxEditor;
set
{
if (Equals(value, _syntaxEditor)) return;
_syntaxEditor = value;
OnPropertyChanged();
}
}
public CodeEditorViewModel()
{
SyntaxEditor = new RadSyntaxEditor();
}
public void Test()
{
using (StreamReader reader = new StreamReader("../../ViewModels/ShellViewModel.cs", Encoding.UTF8))
{
SyntaxEditor.Document = new TextDocument(reader);
}
var cSharpTagger = new CSharpTagger(SyntaxEditor);
SyntaxEditor.TaggersRegistry.RegisterTagger(cSharpTagger);
}
我的xaml文件:
<UserControl x:Class="CodeEditorControl.Views.CodeEditorView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
mc:Ignorable="d" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button x:Name="Test" Grid.Row="0">Test</Button>
<telerik:RadSyntaxEditor x:Name="SyntaxEditor" Grid.Row="1"/>
</Grid>
</UserControl>
该控件显示没有问题,并且正在响应输入等。但是文档不会加载,也不会突出显示语法。Reader加载正确,ReadToEnd()输出正确的文本(ShellViewModel只是一个标准的cs文件,具有36行)。
我正在使用caliburn.micro和MVVM设计。
编辑:我使用相同的模板设置了一个项目,但是使用了背后的代码而不是绑定。这按预期工作。因此,问题出在caliburn.micro和telerik的绑定中。
感谢您的任何帮助。
我注意到CodeEditorViewModel
中的属性为RadSyntaxEditor
类型,相应的UI元素也为RadSytanxEditor
。请注意,这会在Visual Studio的“输出”窗格中产生绑定错误。我认为Caliburn.Micro绑定引擎无法创建这种类型的关系,目前RadSyntaxEditor
有两个单独的实例。一个在XAML中定义,另一个在视图模型中定义。该文档已加载到代码中定义的文档中,但是由于它从未在UI中使用,因此应用程序中没有任何内容。
为解决这个问题,您可以研究Caliburn.Micro框架,更具体地说,如何使用命名约定对数据进行绑定,以将模型属性绑定到UI元素的相应属性。我认为当前绑定(通过约定)默认为RadSyntaxEditor
的Visibility属性。
或者您可以简单地使用像这样的显式数据绑定:
<Button x:Name="Test" Grid.Row="0">Test</Button>
<ContentControl Content="{Binding SyntaxEditor}" Grid.Row="1"/>
请注意,我已将RadSyntaxEditor
控件替换为ContentControl
。