【问题标题】:TreeView and setting IsSelected = wrong item selectedTreeView 和设置 IsSelected = 选择了错误的项目
【发布时间】: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,这修复了我的代码。

标签: wpf treeview


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 2016-09-12
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多