滚动条未自动移动

时间:2017-03-23 02:00:16

标签: c# wpf mvvm

我正在使用WPF和MVVM。 我有包含许多项目的列表。我已将该列表绑定到列表框。 列表中的每个项目按顺序执行,在完成第一个项目后,它将自动执行第二个项目。 我的问题是scrollBar没有自动移动列表中的相应项目。我想移动滚动条与列表中的相应项目。

这是我的财产:

private List<TestItem> testItemsList;
public List<TestItem> TestItemsList
{ get { return testItemsList; }
  set { SetProperty(ref testItemsList, value); } }

这是我的xaml文件数据绑定:

 <ListBox x:Name="listBox" Margin="6,0.938,2.5,4.34" ItemsSource="{Binding StationProperty.TestItemsList}">
             <ListBox.ItemTemplate>
              <DataTemplate>
                    <Grid Margin="1" x:Name="BackgroundGrid">
                        <TextBlock Grid.Column="1" AllowDrop="True"  Text="{Binding TestItemName}" />
                    </Grid>
             </DataTemplate>
            </ListBox.ItemTemplate>
     </ListBox>

1 个答案:

答案 0 :(得分:0)

使用以下代码

public static class ListViewItemBehavior
    {
        public static readonly DependencyProperty AutoScrollToCurrentItemProperty =
            DependencyProperty.RegisterAttached("AutoScrollToSelectedItem",
                typeof(bool), typeof(ListViewItemBehavior),
                new UIPropertyMetadata(default(bool), OnAutoScrollToCurrentItemChanged));

        public static bool GetAutoScrollToCurrentItem(DependencyObject obj)
        {
            return (bool)obj.GetValue(AutoScrollToCurrentItemProperty);
        }

        public static void OnAutoScrollToCurrentItemChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            var listView = obj as ListBox;
            if (listView == null) return;

            var newValue = (bool)e.NewValue;
            if (newValue)
                listView.SelectionChanged += listviewSelectionChanged;
            else
                listView.SelectionChanged -= listviewSelectionChanged;
        }

        static void listviewSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var listview = sender as ListView;
            if (listview == null || listview.SelectedItem == null || listview.Items == null) return;

            listview.Items.MoveCurrentTo(listview.SelectedItem);
            listview.ScrollIntoView(listview.SelectedItem);
        }

        public static void SetAutoScrollToCurrentItem(DependencyObject obj, bool value)
        {
            obj.SetValue(AutoScrollToCurrentItemProperty, value);
        }
    }

在视图中添加参考:

 xmlns:listviewHelper="clr-namespace:XXXX.DependencyObjects"

在listview中使用如下:

 <ListView listviewHelper:ListViewItemBehavior.AutoScrollToCurrentItem="True">

以上代码经过测试,确实可行。请尝试。