次のもの(ActualWidth
2で割ったもの)をいただけますか?
<StackPanel Name="SP2" Width="{Binding ElementName=SP1, Path=ActualWidth/2}">
私にはうまくいかないようです。
ありがとう。
次のもの(ActualWidth
2で割ったもの)をいただけますか?
<StackPanel Name="SP2" Width="{Binding ElementName=SP1, Path=ActualWidth/2}">
私にはうまくいかないようです。
ありがとう。
カスタム コンバーターを使用して、単純な計算を XAML で直接実行できます。
たとえば、次の実装を見てください。
簡単な使い方:
<RotateTransform Angle="{Binding Text, ElementName=Seconds,
Converter={ikriv:MathConverter}, ConverterParameter=x*6}" />
古典的なアプローチは、読み取り専用の計算されたプロパティを作成することです。したがって、この単純なケースでは、2 番目のプロパティを追加できますHalfWidth
。
public double HalfWidth
{
get
{
return ActualWidth / 2.0;
}
}
悪いニュースは、ActualWidth
が更新されたときStackPanel
に、バインドされたビューの が更新されHalfWidth
ないことです。HalfWidth
これは、ビューが変更されたことを認識していないためです。
HalfWidth
のセッターでプロパティ変更イベントを発生させることによりActualWidth
、ビューはクエリを実行HalfWidth
し、正しい値を取得します。
private double _actualWidth;
public double ActualWidth
{
get
{
return _actualWidth;
}
set
{
if (_actualWidth != value)
{
_actualWidth = value;
OnPropertyChanged("ActualWidth");
OnPropertyChanged("HalfWidth");
}
}
}
このアプローチの主な問題は、セッターのない計算されたプロパティが多数ある場合、すぐに悪夢になることです。
そのため、(MVVM パターンでは) 私は個人的にカスタム コンバーターを使用することを好みます。
いいえ、バインディングではプロパティ (および場合によっては配列/コレクションへのインデックス) のみを使用できます。
代わりに、目的の値 (ActualWidth/2 など) を返す通知プロパティにバインドするか、計算を適用して値を返すコンバーターを使用する必要があります。