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

Ash*_*vis 23 c# wpf xaml mvvm actualwidth

我想将控件的只读属性绑定到我的视图模型,以便该值在视图模型中可用.

这样做的最佳方式是什么?

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

我会使用Mode=OneWayToSource,但这不适用于只读属性:

  <Border
      ...
      ActualWidth="{Binding MyDataModelWidth, Mode=OneWayToSource}"
      >
      ... child controls ...
  </Border>
Run Code Online (Sandbox Code Playgroud)

我目前的做法是处理SizeChanged边框,代码隐藏将值插入视图模型,但这感觉不太对.

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

更新:我的问题实际上是这个问题的重复:将 只读GUI属性推回到ViewModel

Gro*_*ozz -1

你真的需要绑定吗?

    class MyVM
    {
        FrameworkElement _context;

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

        public double Width
        {
            get { return _context.ActualWidth; }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 这是一个有趣的想法,但是 UI 对象是从视图模型对象生成的,因此我无法通过构造函数传入 FrameworkElement。我想我可以稍后将视图模型对象绑定到 FrameworkElement,但这听起来违反了 WPF 原则(无论如何我都可能违反它,但至少在我当前的实现中,视图模型没有显式访问 UI)。 (2认同)
  • 一般来说,ViewModel 不应该知道(阅读:引用)UI 相关代码。在这种情况下,您需要引用 WPF 特定程序集。 (2认同)