2010-11-11 26 views
1

Je voudrais utiliser la méthode ScrollToVerticalOffset d'un ScrollViewer pour aller en haut du scrollviewer.ScrollViewer et ScrollToVerticalOffset avec mvvm

Mais avec une approche MVVM.

Je pense que je dois créer une propriété de dépendance pour prendre ce comportement.

EDIT: Le comportement est:

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(); 
    } 
} 

utilisé comme:

<ScrollViewer> 
     <Interactivity:Interaction.Behaviors> 
      <fxBehavior:ScrollPositionBehavior Position="{Binding Position}" /> 
     </Interactivity:Interaction.Behaviors> 
     <other things ...> 
    </ScrollViewer> 

avec

xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:fxBehavior="clr-namespace:MyNamespace.Behavior;assembly=MyAssembly" 

J'ai une exception XAML de l'analyseur:

c'est un : AG_E_PARSER_BAD_PROPERTY_VALUE

Notez que j'utilise le comportement basé sur un FrameworkElement, car j'utilise silverlight 3 (en fait, c'est SL pour WP7). J'ai vu que la liaison ne devrait fonctionner que pour FrameworkElement.

Merci d'avance pour votre aide

Répondre

1

Vous étiez sur la bonne voie. Tout d'abord vous devez changer votre méthode OnPositionChanged pour savoir quelle instance du comportement avait changé son Position:

private static void OnPositionChanged(DependencyObject d, 
             DependencyPropertyChangedEventArgs e) 
{ 
    ScrollPositionBehavior behavior = d as ScrollPositionBehavior; 
    double value = (double)e.NewValue; 
    behavior.AssociatedObject.ScrollToVerticalOffset(value); 
} 

Ensuite, vous obtiendrez le ScrollViewer comme objet associé lorsque vous associez le comportement à lui:

<ScrollViewer> 
    <i:Interaction.Behaviors> 
     <my:ScrollPositionBehavior Position="{what you need, e.g. Binding}" /> 
    </i:Interaction.Behaviors> 
</ScrollViewer> 

Notez que si vous utilisez une fixation il peut être un OneWay obligatoire, parce que le Position ne sera jamais mis à jour par le get comportement lui-même.

+0

merci pour votre aide, j'ai maintenant une exception parser xaml – Tim

+0

S'il vous plaît être plus précis - XamlParseException signifie qu'il y a une erreur sur votre code XAML. – robertos

+0

merci pour votre réponse, voir les éditions – Tim