15

我可以有以下(ActualWidth除以2)吗?

<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}" />

经典的方法是创建一个只读的计算属性。所以在这个简单的例子中,您可以添加第二个属性HalfWidth

public double HalfWidth
{
    get
    {
        return ActualWidth / 2.0;
    }
}

坏消息是,当ActualWidth更新时,StackPanel绑定到的视图上的HalfWidth不会更新。这是因为视图不知道HalfWidth发生了变化。

HalfWidth通过在 的 setter 中引发属性更改事件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 回答