2015-01-07 34 views
1

所以我有一个ScrollBar的Maximum属性绑定到一个依赖项对象,我希望LargeChange和SmallChange属性始终是这个长度的不变分数。我目前在代码隐藏中实现这一点,但我试图切换到全XAML方法。你能引用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中)?谢谢!

回答

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(); 
    } 
} 

您可能需要检查valueDependencyProperty.UnsetValue,因为有时,依赖属性都是在某些点未设置。

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

该转换器然后可以添加为您的XAML的静态资源:

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

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

然后它可以在绑定使用,如上面的一个:

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

感谢您的示例和链接。这基本上成了我为价值转换器的介绍。很有用! – reservoirman

+0

@reservoirman:我编辑了我的答案,提到'DependencyProperty.UnsetValue',因为如果你是新的值转换器,这可能会成为不必要的问题来源。 –

1

要绑定只是某些属性相同的控制的其他财产的价值时,可以使用RelativeSource.Self

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

这将设置SmallChange到相同的值Maximum

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

相关问题