如何绑定只读的 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),以便在视图模型中可以访问其值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

WPF: 只读依赖属性的介绍与实践

WPF: 只读依赖属性的介绍与实践

WPF入门教程系列十三——依赖属性

如何在 WPF 中的控件上绑定本地属性

如何将索引属性绑定到 WPF 中的控件

WPF。查找绑定到特定属性的控件