TreeView和设置IsSelected =选择了错误的项目

时间:2012-01-31 08:11:59

标签: wpf treeview

我有一个小的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的节点。

关于我可能遗失的任何提示?

1 个答案:

答案 0 :(得分:0)

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