关注ListBoxItem并不会更新其样式

时间:2016-05-19 14:10:36

标签: c# wpf user-interface attached-properties

A有一个ListBox需要在特定情况下聚焦特定项目(例如,在显示搜索结果时)。这是通过附加属性完成的,使用以下函数:

public static void OnElementIndexPropertyChanged (DependencyObject DObject, DependencyPropertyChangedEventArgs Args)
  {
  ListBox ListBoxControl = DObject as ListBox;

  if (ListBoxControl != null &&
      (int)Args.NewValue != -1)
    {
    ListBoxControl.ScrollIntoView (ListBoxControl.Items[(int)Args.NewValue]);
    ListBoxControl.UpdateLayout ();

    var ListBoxItem = (ListBoxItem)ListBoxControl.ItemContainerGenerator.ContainerFromItem (ListBoxControl.Items[(int)Args.NewValue]);
    ListBoxControl.SelectedItem = ListBoxItem;
    ListBoxItem.Focus ();
    }
  }

现在,ListBoxControl确实获得了键盘焦点(如果我按住Alt它会在它周围显示一个虚线边框,并且它使用箭头键向上/向下移动它正常工作),但是,样式不会更新。最后选择的项目保留蓝色突出显示,而新选择的项目未更新以显示蓝色突出显示。它只能在项目聚焦和突出显示之前第一次正常工作。

除了手动更改背景/样式之外,还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

我习惯将SelectedItem设置为实际项目,而不是该项目的容器。由于您已经拥有索引,因此使用SelectedIndex似乎更自然。通过将ListBox行替换为此,我能够选择使用该样式的SelectedItem

ListBoxControl.SelectedIndex = (int)Args.NewValue;

<强> P.S。

我应该补充一点,也许我并没有完全理解这个问题,因为我想知道你为什么不只是使用SelectedIndex而不是自定义附加属性来改变选择(可能是因为滚动不会同样的?)。

答案 1 :(得分:0)

感谢@ChiuneSugihara,我意识到我正在将SelectedItem设置为容器,而不是实际项目。改变行

ListBoxControl.SelectedItem = ListBoxItem;

ListBoxControl.SelectedItem = ListBoxItem.Content;

足以使其按预期工作。