2010-11-11 97 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