我正在使用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>
答案 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">
以上代码经过测试,确实可行。请尝试。