我想使用ScrollViewer的ScrollToVerticalOffset方法转到scrollviewer的顶部。
但是使用MVVM approch。
我认为我必须创建一个依赖属性才能采取这种行为。
编辑: 行为是:
public class ScrollPositionBehavior : Behavior<FrameworkElement>
{
public double Position
{
get { return (double)GetValue(PositionProperty); }
set { SetValue(PositionProperty, value); }
}
public static readonly DependencyProperty PositionProperty = DependencyProperty.Register("Position", typeof(double), typeof(ScrollPositionBehavior), new PropertyMetadata((double)0, new PropertyChangedCallback(OnPositionChanged)));
protected override void OnAttached()
{
base.OnAttached();
}
private static void OnPositionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ScrollPositionBehavior behavior = d as ScrollPositionBehavior;
double value = (double)e.NewValue;
((ScrollViewer)(behavior.AssociatedObject)).ScrollToVerticalOffset(value);
}
protected override void OnDetaching()
{
base.OnDetaching();
}
}
用过:
<ScrollViewer>
<Interactivity:Interaction.Behaviors>
<fxBehavior:ScrollPositionBehavior Position="{Binding Position}" />
</Interactivity:Interaction.Behaviors>
<other things ...>
</ScrollViewer>
带
xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:fxBehavior="clr-namespace:MyNamespace.Behavior;assembly=MyAssembly"
我有一个解析器xaml异常:
这是:AG_E_PARSER_BAD_PROPERTY_VALUE
请注意,我正在使用基于FrameworkElement的行为,因为我正在使用silverlight 3(事实上,这是WP的SL)。我已经看到绑定应该仅适用于FrameworkElement。
提前感谢您的帮助
答案 0 :(得分:1)
你是在正确的道路上。首先,您需要更改OnPositionChanged
方法,以找出其Position
更改的行为实例:
private static void OnPositionChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
ScrollPositionBehavior behavior = d as ScrollPositionBehavior;
double value = (double)e.NewValue;
behavior.AssociatedObject.ScrollToVerticalOffset(value);
}
然后,当您将行为附加到ScrollViewer
时,您将获得<ScrollViewer>
<i:Interaction.Behaviors>
<my:ScrollPositionBehavior Position="{what you need, e.g. Binding}" />
</i:Interaction.Behaviors>
</ScrollViewer>
作为关联对象:
OneWay
请注意,如果您使用绑定,则它可以是Position
绑定,因为{{1}}永远不会被行为本身更新。