我有一个小的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的节点。
关于我可能遗失的任何提示?
答案 0 :(得分:0)
行;有时候只需要与某人谈论这个问题。在我写完这篇文章之后,我想:IsSelected属性被调用两次,首先是最近添加的节点的IsSelected=true
和先前选择的节点上的IsSelected = false。因为我总是引发OnSelectedItem
事件(导致ViewModel找出当前选择的节点),最后一次调用获胜 - 这是前一个节点。因此,通过将代码更改为仅在OnSelectedItem
为真时调用_isSelected
,这就修复了我的代码。