是否可以提供以下内容(ActualWidth除以2)?

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


似乎不适合我。

谢谢。

最佳答案

您可以使用自定义转换器直接在XAML中执行简单的计算。

例如,看一下此实现:

MathConverter

简单用法:

<RotateTransform Angle="{Binding Text, ElementName=Seconds,
    Converter={ikriv:MathConverter}, ConverterParameter=x*6}" />




经典方法是创建一个只读的计算属性。
因此,在这种简单情况下,您可以添加第二个属性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模式)我个人更喜欢使用自定义转换器。

07-26 09:16