我可以拥有以下内容(ActualWidth
除以2)吗?
<StackPanel Name="SP2" Width="{Binding ElementName=SP1, Path=ActualWidth/2}">
似乎不适合我。
感谢。
答案 0 :(得分:21)
您可以使用自定义转换器直接在XAML中执行简单计算。
例如,看看这个实现:
简单用法:
<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),或者使用在应用计算时返回值的转换器。