2015-03-15 4 views
0

У меня есть ListView внутри ScrollViewer. Я ожидаю, что выбранный элемент всегда будет виден, что означает, что ScrollViewer выводит его в поле зрения. Однако этого не происходит. Что мне не хватает?ListView внутри ScrollViewer: выбранный элемент не отображается

Это XAML:

<Window x:Class="tt.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:tt" 
    Title="MainWindow" Height="250" Width="200"> 

<Grid> 
    <ScrollViewer> 
     <ListView ItemsSource="{Binding MyData}" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch" 
        IsSynchronizedWithCurrentItem="True"> 
      <ListView.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal"/> 
       </ItemsPanelTemplate> 
      </ListView.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Grid Margin="5" Background="AliceBlue"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="*"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
         </Grid.RowDefinitions> 
         <Button>xx</Button> 
         <TextBlock Grid.Row="1" Text="{Binding}" Margin="20"/> 
         <TextBlock Grid.Row="2" Text="{Binding}" Margin="20"/> 
        </Grid> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ListView> 
    </ScrollViewer> 
</Grid> 
</Window> 

Это код (установка 11-й элемент в качестве выбранного элемента):

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public ObservableCollection<String> MyData { get; set; } 
    ICollectionView dedaultView; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     MyData = new ObservableCollection<string>() { 
      "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve" 
     }; 
     dedaultView = CollectionViewSource.GetDefaultView(MyData); 
     dedaultView.MoveCurrentToPosition(10); 
     DataContext = this; 
    } 
} 

ответ

1

Вам нужно просто расширить контроль ListView таким образом:

public class ListView : System.Windows.Controls.ListView 
{ 
    protected override void OnSelectionChanged(SelectionChangedEventArgs e) 
    { 
     base.OnSelectionChanged(e); 

     ScrollIntoView(SelectedItem); 
    } 
} 

И затем используйте его в своем XAML. Надеюсь, это может вам помочь.

+0

Прохладный. Я ожидал его от основных функций ListView, но расширение прост в использовании. –

Смежные вопросы