c# - 如何处理 MVVM/WPF 中过于逻辑的打包控件?
问题描述
我正在使用 AvalonEdit 来显示格式化文本。该应用程序是用 C#/WPF 的 MVVM 架构编写的。
问题是 AvalonEdit 控件包含很多逻辑,只能从控件本身访问。所以,比如说,我想处理当前的选择——因为我必须达到editor.TextArea.Selection
——这不能从视图模型中访问。
现在我的架构可以简单描述为:
- 主视图模型包含
DocumentViewModel
s列表 DocumentViewModel
包含TextDocument
- List of
DocumentViewModel
s 必然会DockingManager
显示为选项卡列表 DockingManager
的 DataTemplate 设置为我的控件,其中包含TextEditor
TextDocument
fromDocumentViewModel
绑定到的Document
属性TextEditor
说,我想从主窗口的视图模型中访问选定的文本。我可以访问DocumentViewModel
当前活动的文档,但我无法访问呈现它的控件(它是通过 DataTemplate 的机制创建和管理的DockingManager
)
通常我通过接口将视图传递给视图模型来解决这类问题 - 这样视图模型可能会(间接地)要求视图做一些我无法绑定或通过命令传递的事情。但是由于我无法控制文档视图的创建,所以我无法使用这种解决方案。
如何从仅具有 DocumentViewModel 的 MainWindowViewModel 访问 TextEditor?以及如何在不破坏 MVVM 模型的情况下做到这一点?(显然我可能会尝试通过可视化树来访问控件,但那是黑客行为,我绝对想避免它)
解决方案
推荐阅读
- c# - 将 json 反序列化为对象和字典
- c++ - 图像读取并保存到特定文件
- http - 测试 golang http/1 服务器发送超大帧,但不应该
- assembly - test 和 testl 和 testb 有什么区别
- python - 熊猫数据框未正确求和
- docker - Jarvis 安装问题“OCI 运行时创建失败:container_linux.go:367”
- swift - SWIFTUI 中的 XML 解码器
- linux - 在带有 WSL2 的 Windows 10 的 Docker Desktop 中,Docker 容器在哪里运行以及 Linux 容器如何运行 Java 应用程序,而不是 Windows Nanoserver?
- javascript - 渲染三个后如何使引导卡(使用 ReactJS)移动到新行?
- rapidminer - Rapidminer 计数总出现次数并按日期排序