数学运算符可以应用于绑定路径吗?

时间:2012-06-29 05:43:23

标签: wpf xaml silverlight binding converter

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

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

似乎不适合我。

感谢。

2 个答案:

答案 0 :(得分:21)

您可以使用自定义转换器直接在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模式中)我个人更喜欢使用自定义转换器。

答案 1 :(得分:2)

不,您只能在绑定中使用属性(以及在某些情况下索引到数组/集合中)。

相反,您需要绑定到返回预期值的notify属性(例如ActualWidth / 2),或者使用在应用计算时返回值的转换器。