绑定/绑定两个LongListSelectors的滚动位置

Tim*_*Tim 5 c# xaml windows-phone-7 windows-phone windows-phone-8

在我的Windows Phone应用程序中,我在页面上有两个LongListSelectors并排.我想这样做,以便当用户滚动其中一个时,另一个滚动相同的数量.

两者的LongListSelectorsItemTemplates总是具有相同的高度.您可以将此视为模仿Excel中的冻结列(左侧LongListSelector仅垂直滚动,右侧水平和垂直滚动.

任何人都可以指出我正确的方向如何做到这一点?我愿意在代码隐藏中做这件事,或者如果不能用绑定做的话.

Sha*_*rot 3

您可以通过挂接到 LongListSelector 的 ViewportControl 来完成此操作。当一个 LLS 的视口更改时,更改另一 LLS 的视口。我猜你只需要两个 LLS,所以一个 DependencyProperty 就可以解决问题。我写了一篇博客,其中包含有关如何实现此目标的所有详细信息。

缺点是需要 DependencyProperty

public double ScrollPosition
{
    get { return (double)GetValue(ViewPortProperty); }
    set { SetValue(ViewPortProperty, value); }
}

public static readonly DependencyProperty ViewPortProperty = DependencyProperty.Register(
    "ScrollPosition", 
    typeof(double), 
    typeof(MyLongListSelector), 
    new PropertyMetadata(0d, OnViewPortChanged));
Run Code Online (Sandbox Code Playgroud)

并在视口发生变化时设置该属性。

private void OnViewportChanged(object sender, ViewportChangedEventArgs args)
{
    ScrollPosition = _viewport.Viewport.Top;
}
Run Code Online (Sandbox Code Playgroud)

然后将该属性绑定到 xaml 中的每个 LLS

<dataBoundApp1:MyLongListSelector x:Name="MainLongListSelector" ItemsSource="{Binding Items}"
                                    ScrollPosition="{Binding ScrollPosition, ElementName=MainLongListSelector2, Mode=TwoWay}"/>
<dataBoundApp1:MyLongListSelector x:Name="MainLongListSelector2" ItemsSource="{Binding Items}" Grid.Column="1" 
                                    ScrollPosition="{Binding ScrollPosition, ElementName=MainLongListSelector, Mode=TwoWay}"/>
Run Code Online (Sandbox Code Playgroud)