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