ScrollViewer и ScrollToVerticalOffset с mvvm - PullRequest
       3

ScrollViewer и ScrollToVerticalOffset с mvvm

1 голос
/ 11 ноября 2010

Я бы хотел использовать метод ScrollToVerticalOffset объекта ScrollViewer для перехода к вершине прокрутки.

Но с подходом MVVM.

Я думаю, что мне нужно создать свойство зависимостей для такого поведения.

РЕДАКТИРОВАТЬ: Поведение:

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 (на самом деле это SL для WP7). Я видел, что привязка должна работать только для FrameworkElement.

Заранее спасибо за помощь

1 Ответ

1 голос
/ 12 ноября 2010

Вы были на правильном пути. Прежде всего вам нужно изменить метод 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 никогда не будет обновляться самим поведением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...