2010-11-11 93 views
1

我想使用ScrollViewer的ScrollToVerticalOffset方法去滚动查看器的顶部。ScrollViewer和ScrollToVerticalOffset与mvvm

但随着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 for WP7)。我已经看到绑定只能用于FrameworkElement。

在此先感谢您的帮助

回答

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永远不会通过行为本身进行更新。

+0

感谢您的帮助,我现在有一个xaml解析器异常 – Tim 2010-11-12 11:18:03

+0

请更具体一点--XamlParseException表示您的XAML代码存在错误。 – robertos 2010-11-15 17:48:49

+0

感谢您的回答,请参阅编辑 – Tim 2010-11-17 09:10:41