15

次のもの(ActualWidth2で割ったもの)をいただけますか?

<StackPanel Name="SP2" Width="{Binding ElementName=SP1, Path=ActualWidth/2}">

私にはうまくいかないようです。

ありがとう。

4

2 に答える 2

22

カスタム コンバーターを使用して、単純な計算を XAML で直接実行できます。

たとえば、次の実装を見てください。

MathConverter

簡単な使い方:

<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 パターンでは) 私は個人的にカスタム コンバーターを使用することを好みます。

于 2012-06-29T08:03:11.503 に答える
2

いいえ、バインディングではプロパティ (および場合によっては配列/コレクションへのインデックス) のみを使用できます。

代わりに、目的の値 (ActualWidth/2 など) を返す通知プロパティにバインドするか、計算を適用して値を返すコンバーターを使用する必要があります。

于 2012-06-29T05:55:09.150 に答える