/ / ScrollViewer i ScrollToVerticalOffset z mvvm - silverlight, zachowanie

ScrollViewer i ScrollToVerticalOffset z mvvm - silverlight, zachowanie

Chciałbym użyć metody ScrollToVerticalOffset przeglądarki ScrollViewer, aby przejść na górę przeglądarki scrollviewer.

Ale z aprobatą MVVM.

Myślę, że muszę utworzyć właściwość zależności, aby przyjąć to zachowanie.

EDYTOWAĆ : Zachowanie to:

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

używane jak:

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

z

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

Mam wyjątek xaml analizatora składni:

to jest: AG_E_PARSER_BAD_PROPERTY_VALUE

Zauważ, że używam zachowania opartego na FrameworkElement, ponieważ używam silverlight 3 (w rzeczywistości jest to SL dla WP7). Widziałem, że powiązanie powinno działać tylko dla FrameworkElement.

Z góry dziękuje za twoją pomoc

Odpowiedzi:

1 dla odpowiedzi № 1

Byłeś na dobrej drodze. Przede wszystkim musisz zmienić swój OnPositionChanged metoda, aby dowiedzieć się, które wystąpienie miało swoje zachowanie Position zmieniono:

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

Wtedy dostaniesz ScrollViewer jako obiekt powiązany, gdy dołączasz do niego zachowanie:

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

Zauważ, że jeśli używasz Bindowania, może to być OneWay wiązanie, ponieważ Position nigdy nie zostanie zaktualizowany przez samo zachowanie.