您可以在 XAML 中引用其他属性中的属性吗?

Can you reference properties within other properties in XAML?

所以我有一个 ScrollBar,其 Maximum 属性绑定到一个依赖对象,我希望 LargeChange 和 SmallChange 属性始终是该长度的常数分数。我目前在代码隐藏中实现了这一点,但我正在尝试切换到全 XAML 方法。

所以不是这个:

curSpeedScrollbar.SetBinding(Slider.MaximumProperty, speedBinding);
curSpeedScrollbar.LargeChange = curSpeedScrollbar.Maximum / 1000;
curSpeedScrollbar.SmallChange = curSpeedScrollbar.Maximum / 10000;
curSpeedScrollbar.ViewportSize = curSpeedScrollbar.Maximum / 16;

我正在拍摄这样的东西(但语法正确):

<ScrollBar BorderThickness="1" Height="25" HorizontalAlignment="Stretch" LargeChange = "Maximum / 1000" Margin="208,62,130,106" Maximum="{Binding MaxValue}" Name="curSpeedScrollbar" Orientation="Horizontal" SmallChange = "Maximum / 10000" VerticalAlignment="Stretch" ViewportSize="Maximum / 16" Width="431" Grid.Column="2" Grid.Row="1" />

任何人都可以告诉我执行此操作的正确语法吗?或者是否有更好的方法来实现我想要的(no/minimal 代码隐藏,all/mostly 在 XAML 中)?谢谢!

您可以使用转换器来实现此行为。

可在此处找到用于这些运算的数学转换器: http://www.codeproject.com/Articles/239251/MathConverter-How-to-Do-Math-in-XAML

你的问题分为两个部分,所以我会分别回复每个部分:

如何从 属性

中绑定到 属性

这是可能的,事实上,它一直在进行 - 绑定(几乎)总是从一个 属性 添加到另一个 属性。通常,您只是不引用同一对象的另一个 属性,但这可以通过 RelativeSourceMode.Self:

来完成
LargeChange="{Binding Maximum, RelativeSource={RelativeSource Self}}"

如何绑定到 属性

的乘积值

为此,您必须创建一个 value converter。这种转换器的静态版本可能如下所示:

public class DividingConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((double)value) / 1000;
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

您可能需要检查 value 是否有 DependencyProperty.UnsetValue,因为有时依赖属性在某些时候未设置。

对于更动态的版本,您可以使用绑定中的 ConverterParameter property 来提供要除以的值。

此转换器可以作为静态资源添加到您的 XAML:

<somewhere:DividingConverter x:Key="divConv"/>

(其中 somewhere 是转换器命名空间的命名空间前缀)

然后可以在上面的绑定中使用它:

LargeChange="{Binding Maximum, RelativeSource={RelativeSource Self}, Converter={StaticResource divConv}}"

要将某些 属性 绑定到同一控件的另一个 属性 的值,您可以使用 RelativeSource.Self:

<ScrollBar Maximum="{Binding MaxValue}" SmallChange="{Binding RelativeSource={RelativeSource Self}, Path=Maximum}" ... />

这会将 SmallChange 设置为与 Maximum 相同的值。

但是,这只是您所能得到的,因为无法直接在 XAML 内进行计算。为此,您需要一个转换器,例如,将 Maximum 属性 的值作为输入并 returns 计算结果。