web-dev-qa-db-ja.com

読み取り専用のWPFコントロールプロパティ(ActualWidthなど)をバインドして、ビューモデルでその値にアクセスできるようにする方法を教えてください。

コントロールの読み取り専用プロパティをビューモデルにバインドして、ビューモデルで値を使用できるようにします。

これを行う最良の方法は何ですか?

たとえば、ビューモデルのプロパティにActualWidthをバインドしたいとします。幅の値は、レイアウトロジックを使用してWPFによって生成されるため、通常の場合のように、ビューモデルでこの値を生成してコントロールプロパティにプッシュすることはできません。代わりに、WPFに値を生成させ、それをビューモデルにプッシュする必要があります。

Mode=OneWayToSource、ただしこれは読み取り専用プロパティでは機能しません:

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

私が現在行っている方法は、境界線のSizeChangedを処理することであり、コードビハインドは値をビューモデルにプラグインしますが、これは完全に正しくはありません。

誰かがすでにこの問題を解決していますか?

更新:私の質問は事実上これの複製です: 読み取り専用GUIプロパティをViewModelに戻す

23
Ashley Davis

これが機能しない理由に関する実際の問題は here で説明されています。

ただし、検証に合格するスローセッターを作成するための特定のソリューションは、あなたのケースでは機能しません。

ViewModelのメソッドを呼び出しても問題ないと思います。バグの原因となっているコードが背後にある場合は、インタラクティブ機能を使用して、イベントトリガー(SizeChanged)に基づいてメソッドを呼び出すことができます。

1
sowee15

あなたは本当にそのためのバインディングが必要ですか?

    class MyVM
    {
        FrameworkElement _context;

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

        public double Width
        {
            get { return _context.ActualWidth; }
        }
    }
0
Grozz