我正在尝试在附加属性上使用 BringIntoView 同步我的 ListBox 的滚动。
我的尝试不起作用。当我运行我的代码时,所选项目会在列表框之间同步,但是如果我选择了一个未显示在另一个 ListBox 上的项目,它不会自动滚动。
我有一个带有 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();
}
}
}