使用mvvm的ScrollViewer和ScrollToVerticalOffset

时间:2010-11-11 16:47:18

标签: silverlight behavior

我想使用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。

提前感谢您的帮助

1 个答案:

答案 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}}永远不会被行为本身更新。