【问题标题】:Force wpf control update from View Model从视图模型强制 wpf 控件更新
【发布时间】:2014-11-25 10:50:39
【问题描述】:

我目前正在开发一个 WPF 控件,它只是带有一些附加属性的画布,例如网格线、子级拖放等。

我需要一种机制来从绑定到包含我的画布的视图的视图模型中调用我的一些画布功能。 例如,视图可以包含我的画布和一个“显示网格”按钮。当用户单击按钮时,画布应在其自身上绘制网格。

问题是根据 MVVM 模式执行此操作,而无需在视图的视图模型中直接引用画布。 这样做的最佳做法是什么?

【问题讨论】:

  • 我没有时间写答案看看如何使用 RoutedCommand 将它挂在你的控件中并从你的 ViewModel 中提升它。

标签: wpf mvvm user-controls custom-controls


【解决方案1】:

UI相关的东西仍然可以写在cs文件后面的视图中。这并不意味着您违反了 MVVM。如果视图模型用于业务逻辑,则后面的视图用于视图逻辑。要实现更多的封装性和复用性,可以使用Behaviors

您可以编写一个执行所有绘画逻辑的行为并将其附加到按钮上。甚至您也可以将依赖属性添加到您的行为中以对其进行更多控制。

【讨论】:

  • 是的,所有特定的 UI 相关逻辑都在控制代码隐藏中(我只是从 Canvas 继承)。有一个命令绑定到我的按钮。命令处理程序 ShowGrid() 在视图模型中。我应该在其中写什么才能使网格线出现在画布中?
  • 添加一个具有布尔类型“ShowGridLines”的依赖属性的行为。在 Behavior 中的属性回调中执行网格线渲染逻辑。
  • 如果我理解正确,我需要创建一个附加到按钮的自定义行为,该行为将绑定到我可以从我的 VM 更改的布尔属性。这个解决方案有一个问题:我希望所有渲染逻辑都在画布代码隐藏中。我想用我的画布完成许多类似的任务,我不想在几十个行为中原子化渲染逻辑
猜你喜欢
  • 2013-12-25
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 2019-01-19
相关资源
最近更新 更多