你能在XAML中引用其他属性中的属性吗?

时间:2015-01-07 14:14:52

标签: c# wpf 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" />

有人能告诉我这样做的正确语法吗?或者,如果有更好的方法来实现我想要的(没有/最小代码隐藏,所有/主要在XAML中)?谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

您的问题有两个部分,因此我将逐一回复每个部分:

如何从属性中绑定属性

这是可能的,事实上,它经常被完成 - 绑定(几乎)总是从属性添加以引用另一个属性。通常,您只是不引用同一对象的另一个属性,但可以使用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}}"

答案 2 :(得分:1)

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

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

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

然而,这是你得到的,因为在XAML中不可能直接进行计算。为此,您需要一个转换器,例如,将Maximum属性的值作为输入并返回计算结果。