添付プロパティでBringIntoViewを使用して、リストボックスのスクロールを同期しようとしています。
私の試みはうまくいきません。コードを実行すると、選択したアイテムがリストボックス間で同期されますが、他のリストボックスに表示されていないアイテムを選択すると、自動的にスクロールしません。
IsShownプロパティとItemTextプロパティを持つ単純なViewModelがあります。
<Window.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding IsShown, Mode=TwoWay}"/>
<Setter Property="local:CustomProperties.BringIntoView" Value="{Binding IsShown}"/>
</Style>
<DataTemplate x:Key="DataTemplate1">
<TextBlock Name="_txt" Text="{Binding ItemText}"/>
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="255*"/>
<ColumnDefinition Width="262*"/>
</Grid.ColumnDefinitions>
<ListBox ItemsSource="{Binding ItemList}" ItemTemplate="{StaticResource DataTemplate1}" />
<ListBox Grid.Column="1" ItemsSource="{Binding ItemList}" ItemTemplate="{StaticResource DataTemplate1}" >
</ListBox>
</Grid>
これが私の依存関係のプロパティです
public static class CustomProperties
{
public static readonly DependencyProperty BringIntoViewProperty =
DependencyProperty.RegisterAttached( "BringIntoView",
typeof( bool ),
typeof( CustomProperties ),
new PropertyMetadata( OnBringIntoViewChanged ) );
public static void SetBringIntoView ( DependencyObject o, bool value )
{
o.SetValue( BringIntoViewProperty, value );
}
public static bool GetBringIntoView ( DependencyObject o )
{
return ( bool )o.GetValue( BringIntoViewProperty );
}
private static void OnBringIntoViewChanged ( DependencyObject d, DependencyPropertyChangedEventArgs e )
{
if ( ( bool )e.NewValue )
{
if ( d is FrameworkElement )
( ( FrameworkElement )d ).BringIntoView();
}
}
}