所以我有一个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中)?谢谢!
答案 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
属性的值作为输入并返回计算结果。