Wpf TreeView和setting IsSelected=选择了错误的项目

Wpf TreeView和setting IsSelected=选择了错误的项目,wpf,treeview,Wpf,Treeview,我有一个小WPF应用程序,它有一个树状视图来显示分层数据。我已经创建了一个ViewModel来表示要显示的数据。实际上有两个具体的视图模型,因为我在不同层次上有不同种类的对象 public abstract class TreeViewModelBase { private bool _isSelected; public bool IsSelected { get { return _isSelected; } set {

我有一个小WPF应用程序,它有一个树状视图来显示分层数据。我已经创建了一个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;
    }
}
公共类FooTreeViewModel:TreeViewModelBase
{
公共可观察集合栏{get;private set;}
公共无效AddNewPage(Bar newBar)
{
var newBarTreeViewModel=新的BarTreeViewModel(newBar);
添加(newBarTreeViewModel);
newBarTreeViewModel.IsSelected=true;
}
}
但这就是我遇到麻烦的地方。我注意到正在为最近添加的对象执行IsSelected,但就在一秒钟后,正在为上一个项目执行IsSelected。我觉得这很奇怪

尽管树已正确更新,但树的SelectedItem仍指向上一个节点,而不是最近添加的、标记为IsSelected的节点


有没有关于我可能遗漏什么的提示?

好的;有时只需要和某人谈论这个问题。在我写了这篇文章之后,我想:IsSelected属性会被调用两次,第一次是为最近添加的节点调用
IsSelected=true
,第二次是为之前选择的节点调用IsSelected=false。因为我总是引发
OnSelectedItem
事件(这会导致ViewModel确定当前选择了哪个节点),所以最后一次调用获胜-这是前一个节点。因此,当
\u isSelected
为true时,通过将代码更改为仅调用
OnSelectedItem
,这修复了我的代码。

OK;有时只需要和某人谈论这个问题。在我写了这篇文章之后,我想:IsSelected属性会被调用两次,第一次是为最近添加的节点调用IsSelected=true,第二次是为之前选择的节点调用IsSelected=false。因为我总是引发OnSelectedItem事件(这会导致ViewModel找出当前选择的节点),所以最后一次调用获胜-这是前一个节点。因此,当_isSelected为true时,将代码更改为仅调用OnSelectedItem,这修复了我的代码。