【问题标题】:WPF MVVM ListBox SelectedItem not highlightedWPF MVVM ListBox SelectedItem 未突出显示
【发布时间】:2014-05-02 07:48:01
【问题描述】:

我在一个绑定到视图模型的 WPF 应用程序中有一个简单的 ListBox,所以 XAML 看起来像:

<ListBox ItemsSource="{Binding Drivers}"
         SelectedItem="{Binding SelectedDriver, Mode=TwoWay}" />

在我的视图模型中,已设置 SelectedDriver,因此我希望当视图显示时,列表框中与 SelectedDriver 相关的驱动程序应突出显示,但事实并非如此。

当在视图模型中设置 SelectedItem 值时,我需要做什么才能使 SelectedItem 突出显示?

已解决:根据下面的答案,我意识到虽然我的 SelectedDriver 对象实际上已被设置,但它不属于 Drivers 集合。一旦我纠正了这一点,它就会按预期工作。感谢大家的意见。我没有足够的分数来增加答案的分数,但非常感谢。

edit:视图模型确实实现了 INotifyPropertyChanged。视图中的许多其他项目会根据它们的绑定正确显示。

edit:视图模型构造函数会做一些内务处理,其中一件事就是将各种视图元素设置为先前的状态。这些元素之一是 Drivers 列表框,因此在视图模型代码中,它被设置为您描述的实际项目: SelectedDriver = Drivers.Where(d => d.Id == savedId) 我已经在 Debug 中验证了这段代码正在找到正确的驱动程序,并且 SelectedDriver 的值是正确的,它只是没有在 UI 中突出显示。

【问题讨论】:

  • 你的 ViewModel 是否实现了INotifyPropertyChanged
  • 在页面生命周期的哪个阶段设置 SelectedDriver?

标签: wpf mvvm listbox highlight selecteditem


【解决方案1】:

我所有的视图模型都继承自这个实现 INotifyPropertyChanged 的​​ ViewModelBase。您实际上必须调用事件处理程序来通知 UI 数据已更改。

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
}

所以 SelectedDriver 看起来像这样:

private Driver selectedDriver;
public Driver SelectedDriver
{
    get { return selectedDriver; }
    set
    {
        selectedDriver = value;
        RaisePropertyChanged("SelectedDriver");
    }
}

如果一切都正确绑定,并且 SelectedDriver 属于从 ViewModelBase 继承的类,那么这应该可以工作。如果没有,您可能会检查输出窗口是否存在错误绑定。

【讨论】:

    【解决方案2】:

    如果要从代码中设置集合控件的选定项,则习惯上将其设置为集合中的实际项,即绑定到ItemsSource 属性的数据控制。您可以像这样使用LinQ 轻松做到这一点:

    SelectedDriver = Drivers.Where(d => d.Id == someIdNumber).First();
    

    或者,如果您只想将集合中的第一项设置为选定项,那么您可以这样做:

    SelectedDriver = Drivers[0];
    

    如果仍然不起作用,您是否像@RohitVats 建议的那样实现了INotifyPropertyChanged interface

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 2012-06-19
      • 2011-11-01
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多