WPF MVVM ListBox SelectedItem 未突出显示

标签 wpf mvvm listbox highlight selecteditem

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

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

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

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

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

编辑: View 模型确实实现了 INotifyPropertyChanged。 View 中的许多其他项目会根据它们的绑定(bind)正确显示。

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

最佳答案

我所有的 View 模型都继承自这个实现 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");
    }
}

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

关于WPF MVVM ListBox SelectedItem 未突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22618132/

相关文章:

.net - 如何在运行时在代码中应用动态样式?

wpf - 如何在 WPF 中对 DataGrid 列标题进行分组

c# - Silverlight + MVVM + 绑定(bind) = 内存泄漏?

c# - 在 MVVM WPF 应用程序中处理导航

python - Tkinter Listbox 以蓝色突出显示一个元素,但在另一个元素周围放置黑色边框?

javascript - 如何使用 jQuery 创建 select 值的元素编号?

python - 更新 Tkinter 列表框而不退出并重新进入?

c# - 使用 mvvm 在 wpf 中动态加载用户控件

c# - 如何在 WPF 列表框中获取选中的项目?

wpf - 重构 WPF MVVM 以提高可测试性