如何绑定只读的 WPF 控件属性(例如 ActualWidth),以便在视图模型中可以访问其值? [复制]
Posted
技术标签:
【中文标题】如何绑定只读的 WPF 控件属性(例如 ActualWidth),以便在视图模型中可以访问其值? [复制]【英文标题】:How to bind a read-only WPF control property (eg ActualWidth) so its value is accessible in the view model? [duplicate] 【发布时间】:2011-05-25 05:11:49 【问题描述】:我想将控件的只读属性绑定到我的视图模型,以便该值在视图模型中可用。
最好的方法是什么?
例如,我想将ActualWidth
绑定到我的视图模型中的一个属性。宽度值是由 WPF 使用其布局逻辑生成的,因此我无法在我的视图模型中生成此值并将其推送到控件属性,这通常是这种情况。相反,我需要让 WPF 生成值并将其推送到视图模型。
我只会使用Mode=OneWayToSource
,但这不适用于只读属性:
<Border
...
ActualWidth="Binding MyDataModelWidth, Mode=OneWayToSource"
>
... child controls ...
</Border>
我目前的做法是为边框处理SizeChanged
,代码隐藏将值插入视图模型,但这感觉不太对。
有人已经解决了这个问题吗?
更新: 我的问题实际上是这个问题的副本: Pushing read-only GUI properties back into ViewModel
【问题讨论】:
检查这些链接social.msdn.microsoft.com/Forums/en-US/wpf/thread/…***.com/questions/1083224/… 【参考方案1】:描述了为什么这不起作用的实际问题here。
但是,创建 throwing setter 以通过验证的给定解决方案不适用于您的情况。
我认为在 ViewModel 上调用方法是可以的。如果那是困扰您的部分代码,也许您可以使用交互性来调用基于事件触发器 (SizeChanged) 的方法。
【讨论】:
【参考方案2】:你真的需要一个绑定吗?
class MyVM
FrameworkElement _context;
public MyVM(FrameworkElement context)
_context = context;
public double Width
get return _context.ActualWidth;
【讨论】:
这是一个有趣的想法,但是 UI 对象是从视图模型对象生成的,所以我无法通过构造函数传入 FrameworkElement。我想我可以稍后将视图模型对象绑定到 FrameworkElement,但这听起来会违反 WPF 原则(我可能无论如何都违反了它,但至少在我当前的实现中,视图模型没有显式访问 UI)。 通常 ViewModel 不应该知道(阅读:有参考)依赖于 UI 的代码。在这种情况下,您需要对 WPF 特定程序集的引用。以上是关于如何绑定只读的 WPF 控件属性(例如 ActualWidth),以便在视图模型中可以访问其值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章