【问题标题】:Can a mathematical operator be applied to the Binding path?可以将数学运算符应用于绑定路径吗?
【发布时间】:2012-06-30 16:18:29
【问题描述】:

我可以得到以下(ActualWidth 除以 2)吗?

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

似乎对我不起作用。

谢谢。

【问题讨论】:

  • 你想做什么?将Width 设置为SP1.ActualWidth 值的一半?如果是这样,Converter 可能就是您所追求的。
  • 请不要在绑定中使用ActualWidth,因为它不是依赖属性,不一定能达到您的预期。请参阅问题 stackoverflow.com/questions/7403151 (WPF) 和 stackoverflow.com/questions/1602148 (Silverlight)。
  • @PhilipKendall,是的,这就是我想要做的。每次调整窗口大小时,我都希望 SP2 的宽度是 SP1 的一半。
  • @LukeWoodward:感谢您的提示。
  • 将两个堆栈面板放在一个两列网格内,列宽分别为“2*”和“*”

标签: wpf xaml silverlight binding converter


【解决方案1】:

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

例如,看看这个实现:

MathConverter

简单用法:

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

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

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

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

通过在ActualWidth 的设置器中引发HalfWidth 的属性更改事件,视图将查询HalfWidth 并因此检索正确的值。

private double _actualWidth;
public double ActualWidth
{
    get
    {
        return _actualWidth;
    }
    set
    {
        if (_actualWidth != value)
        {
            _actualWidth = value;
            OnPropertyChanged("ActualWidth");
            OnPropertyChanged("HalfWidth");
        }
    }
}

这种方法的主要问题是,当我们有大量没有设置器的计算属性时,它很快就会变成一场噩梦。

这就是为什么(在 MVVM 模式中)我个人更喜欢使用自定义转换器。

【讨论】:

  • 谢谢。如何决定是完成所有这些工作还是只在 Windows 的 SizeChanged 事件处理程序中的代码中添加一行代码?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 2019-03-29
    • 2016-05-11
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多