【问题标题】:ScrollViewer and ScrollToVerticalOffset with mvvm使用 mvvm 的 ScrollViewer 和 ScrollToVerticalOffset
【发布时间】:2010-11-11 16:47:18
【问题描述】:

我想使用 ScrollViewer 的 ScrollToVerticalOffset 方法转到滚动查看器的顶部。

但使用 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(实际上,这是 WP7 的 SL)。我已经看到绑定应该只对 FrameworkElement 起作用。

提前感谢您的帮助

【问题讨论】:

    标签: silverlight behavior


    【解决方案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 永远不会被行为本身更新。

    【讨论】:

    • 请更具体一些 - XamlParseException 表示您的 XAML 代码有错误。
    • 您确定它可以绑定到 Behavior 属性吗?
    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多