【发布时间】:2012-02-01 00:19:17
【问题描述】:
我有一个小 WPF 应用程序,它有一个 TreeView 来显示分层数据。我创建了一个 ViewModel 来表示要显示的数据。实际上有几个具体的 ViewModel,因为我在层次结构的各个级别上都有不同类型的对象。
public abstract class TreeViewModelBase
{
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
if (value == _isSelected) return;
_isSelected = value;
OnItemSelected(this, new TreeViewModelSelectedEventArgs(this));
RaisePropertyChanged(() => IsSelected);
}
}
}
因此,为了向三个节点添加一个新节点,我只需添加一个新的 ViewModel 对象并让数据绑定执行更新树的魔法。我还想让最近添加的节点成为选定节点,所以我将 IsSelected 属性设置为 true。
public class FooTreeViewModel : TreeViewModelBase
{
public ObservableCollection<BarTreeViewModel> Bars { get; private set; }
public void AddNewPage(Bar newBar)
{
var newBarTreeViewModel = new BarTreeViewModel(newBar);
Bars.Add(newBarTreeViewModel);
newBarTreeViewModel.IsSelected = true;
}
}
但这似乎是我遇到麻烦的地方。我观察到我最近添加的对象的 IsSelected 正在执行,但一秒钟后,前一个项目的 IsSelected 正在执行。这对我来说似乎很奇怪。
虽然树已正确更新,但树的 SelectedItem 仍指向前一个节点,而不是最近添加的标有 IsSelected 的节点。
关于我可能缺少什么的任何提示?
【问题讨论】:
-
好的;有时只需要与某人讨论这个问题。在我写完这篇文章后,我想:IsSelected 属性被调用了两次,第一次是最近添加的节点的 IsSelected=true 和先前选择的节点上的 IsSelected=false。因为我总是引发 OnSelectedItem 事件(这会导致 ViewModel 确定当前选择了哪个节点)最后一次调用获胜 - 这是前一个节点。因此,通过将代码更改为仅在 _isSelected 为真时调用 OnSelectedItem,这修复了我的代码。