gpt4 book ai didi

WPF MVVM ListBox SelectedItem 未突出显示

转载 作者:行者123 更新时间:2023-12-03 10:51:39 25 4
gpt4 key购买 nike

我在绑定(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com