コントロールの読み取り専用プロパティをビューモデルにバインドして、ビューモデルで値を使用できるようにします。
これを行う最良の方法は何ですか?
たとえば、ビューモデルのプロパティにActualWidth
をバインドしたいとします。幅の値は、レイアウトロジックを使用してWPFによって生成されるため、通常の場合のように、ビューモデルでこの値を生成してコントロールプロパティにプッシュすることはできません。代わりに、WPFに値を生成させ、それをビューモデルにプッシュする必要があります。
Mode=OneWayToSource
、ただしこれは読み取り専用プロパティでは機能しません:
<Border
...
ActualWidth="{Binding MyDataModelWidth, Mode=OneWayToSource}"
>
... child controls ...
</Border>
私が現在行っている方法は、境界線のSizeChanged
を処理することであり、コードビハインドは値をビューモデルにプラグインしますが、これは完全に正しくはありません。
誰かがすでにこの問題を解決していますか?
更新:私の質問は事実上これの複製です: 読み取り専用GUIプロパティをViewModelに戻す
これが機能しない理由に関する実際の問題は here で説明されています。
ただし、検証に合格するスローセッターを作成するための特定のソリューションは、あなたのケースでは機能しません。
ViewModelのメソッドを呼び出しても問題ないと思います。バグの原因となっているコードが背後にある場合は、インタラクティブ機能を使用して、イベントトリガー(SizeChanged)に基づいてメソッドを呼び出すことができます。
あなたは本当にそのためのバインディングが必要ですか?
class MyVM
{
FrameworkElement _context;
public MyVM(FrameworkElement context)
{
_context = context;
}
public double Width
{
get { return _context.ActualWidth; }
}
}