MVVMに違反することなくこれを行う方法は次のとおりです。背後
<ListBox DockPanel.Dock="Top"
ItemsSource="{Binding Books, Mode=OneWay}"
SelectedItem="{Binding CurrentBook, Mode=TwoWay}"
SelectedIndex="{Binding SelectedIndex}"
SelectionChanged="ListBox_SelectionChanged"
/>
コード:
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var lb = (ListBox)sender;
lb.ScrollIntoView(lb.SelectedItem);
}
そして、ここではそれを行うには、より立派な方法です。何もないこの種のコードバックを使用していますが、このような動作が複数のビューで複数回使用される場合は、イベントハンドラをコピーして貼り付けるよりも、添付プロパティを使用する方が便利です。また、DataTemplate
のような文脈でも使用できるようになりました。ここにはコードがありません。
コードが少し前ですが、添付されたプロパティをプロジェクトのListBox
に簡単に追加できます。
public static class ListBoxExtensions
{
#region ListBoxExtensions.KeepSelectedItemVisible Attached Property
public static bool GetKeepSelectedItemVisible(ListBox lb)
{
return (bool)lb.GetValue(KeepSelectedItemVisibleProperty);
}
public static void SetKeepSelectedItemVisible(ListBox lb, bool value)
{
lb.SetValue(KeepSelectedItemVisibleProperty, value);
}
public static readonly DependencyProperty KeepSelectedItemVisibleProperty =
DependencyProperty.RegisterAttached("KeepSelectedItemVisible", typeof(bool), typeof(ListBoxExtensions),
new PropertyMetadata(false, KeepSelectedItemVisible_PropertyChanged));
private static void KeepSelectedItemVisible_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var lb = (ListBox)d;
if ((bool)e.NewValue)
{
lb.SelectionChanged += ListBox_SelectionChanged;
ScrollSelectedItemIntoView(lb);
}
else
{
lb.SelectionChanged -= ListBox_SelectionChanged;
}
}
private static void ScrollSelectedItemIntoView(ListBox lb)
{
lb.ScrollIntoView(lb.SelectedItem);
}
private static void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ScrollSelectedItemIntoView((ListBox)sender);
}
#endregion ListBoxExtensions.KeepSelectedItemVisible Attached Property
}
XAML:
<ListBox DockPanel.Dock="Top"
ItemsSource="{Binding Books, Mode=OneWay}"
SelectedItem="{Binding CurrentBook, Mode=TwoWay}"
SelectedIndex="{Binding SelectedIndex}"
local:ListBoxExtensions.KeepSelectedItemVisible="True"
/>
迅速な応答のためのおかげで、それは明日を見ていきます^^ –