我可以有以下(ActualWidth
除以2)吗?
<StackPanel Name="SP2" Width="{Binding ElementName=SP1, Path=ActualWidth/2}">
似乎对我不起作用。
谢谢。
我可以有以下(ActualWidth
除以2)吗?
<StackPanel Name="SP2" Width="{Binding ElementName=SP1, Path=ActualWidth/2}">
似乎对我不起作用。
谢谢。
您可以使用自定义转换器直接在 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
通过在 的 setter 中引发属性更改事件ActualWidth
,视图将查询HalfWidth
并检索正确的值。
private double _actualWidth;
public double ActualWidth
{
get
{
return _actualWidth;
}
set
{
if (_actualWidth != value)
{
_actualWidth = value;
OnPropertyChanged("ActualWidth");
OnPropertyChanged("HalfWidth");
}
}
}
这种方法的主要问题是,当我们有大量没有设置器的计算属性时,它很快就会变成一场噩梦。
这就是为什么(在 MVVM 模式中)我个人更喜欢使用自定义转换器。
不,您只能在绑定中使用属性(在某些情况下还可以使用数组/集合的索引)。
相反,您需要绑定到返回预期值的通知属性(例如 ActualWidth/2),或者使用返回值并应用您的计算的转换器。