如何绑定只读的WPF控件属性(例如ActualWidth),以便在视图模型中可访问其值?

问题描述:

我想将控件的只读属性绑定到我的视图模型,以便视图模型中的值可用。如何绑定只读的WPF控件属性(例如ActualWidth),以便在视图模型中可访问其值?

这样做的最好方法是什么?

例如,我想将ActualWidth绑定到我的视图模型中的属性。宽度值由WPF使用其布局逻辑生成,因此我无法在我的视图模型中生成此值并将其推送到控件属性,正如通常情况一样。相反,我需要让WPF生成值并将其推送到视图模型。

我只想用Mode=OneWayToSource,但这并不能为只读属性的作用:

<Border 
     ... 
     ActualWidth="{Binding MyDataModelWidth, Mode=OneWayToSource}" 
     > 
     ... child controls ... 
    </Border> 

我这样做是目前处理SizeChanged用于边框的方法和代码隐藏的插头价值观视为模型,但这并不完全正确。

有没有人已经解决了这个问题?

UPDATE: 我的问题实际上是这其中的一个副本: Pushing read-only GUI properties back into ViewModel

+0

真棒。几乎在同一时间,同一链接。哈哈! – Nawaz 2010-12-14 11:16:52

+0

第二个链接是一个很好的可重用解决方案,其基础就是你正在做的事(使用SizeChanged事件)。 – sowee15 2010-12-14 11:18:51

+3

请问您能否将答案写入答案,*上的答案不应该只包含链接... – 2013-12-21 15:19:34

你真的需要一个绑定?

class MyVM 
    { 
     FrameworkElement _context; 

     public MyVM(FrameworkElement context) 
     { 
      _context = context; 
     } 

     public double Width 
     { 
      get { return _context.ActualWidth; } 
     } 
    } 
+1

它是一个有趣的想法,但UI对象是从视图模型对象生成的,所以我无法通过构造函数传入FrameworkElement。我想我可以稍后将视图模型对象绑定到FrameworkElement,但是这听起来像违反了WPF原则(我可能会违反它,但至少在我当前的实现中视图模型没有显式访问UI)。 – 2010-12-14 11:07:06

的实际问题,为什么这是行不通的描述here

但是,给定的解决方案来创建抛出setter来通过验证不会在你的情况下工作。

我认为可以在ViewModel上调用方法。如果这是错误的部分背后的代码,也许你可以使用交互性来调用基于事件触发器(SizeChanged)的方法。