none
如何检索动态加载节点的MVVM WPF TreeView RRS feed

  • 问题

  • Josh Smith在“Simplifying the WPF TreeView by Using the ViewModel Pattern”一文中给出了检索以MVVM方式操控的WPF Treeview树节点的方法。该方法是在他的文中所附实例的第一个项目上实现的。该项目批式生成整个树。我的问题是:该检索方法可以在动态加载节点的MVVM操控的WPF Treeview树上实现吗?或者说,该方法可以在他文中所附示例的第二个项目“LoadOnDemand”上实现吗?谢谢。

    ly_he

    2015年4月24日 8:07

答案

  • Hi ly_he,

    >>"该检索方法可以在动态加载节点的MVVM操控的WPF Treeview树上实现吗?"

    我觉得是可以实现的,只要有已加载的节点,就可以从已经存在的节点中查询或者匹配。

    >>"该方法可以在他文中所附示例的第二个项目“LoadOnDemand”上实现吗?"

    我花了点时间看了一下这个Demo,我的理解是动态加载的节点在进行检索时,先判断当前是否有节点存在,当有节点存在时,对节点进行匹配,如果当前节点全都不匹配,则判断子节点是否已加载或当前节点是否已展开,如果没有展开,则没有匹配的节点,如果当前节点已展开,则重复先前的匹配操作。这大致是我的思路,你可以参考一下。我写了个Sample,在CountryViewModel中需要定义命令,形式同你说的第一个Demo差不多,命令具体的执行方法是CountryViewModel中的PerformSearch()方法,CountryViewModel构造函数中需要实例化命令,代码段如下:

    void PerformSearch()
            {
                foreach(RegionViewModel r in _regions)
                {
                    bool exist = r.RegionName.IndexOf(_searchText, StringComparison.InvariantCultureIgnoreCase) > -1;
                    if (exist)
                    {
                        if (r.Parent != null)
                        {
                            r.Parent.IsExpanded = true;
                        }
                        r.IsSelected = true;
                    }
                    else
                    {
                        if (r.IsExpanded)
                        {
                            foreach(StateViewModel s in r.Children)
                            {
                                bool s_exist = s.StateName.IndexOf(_searchText, StringComparison.InvariantCultureIgnoreCase) > -1;
                                if (s_exist)
                                {
                                    if (s.Parent != null)
                                    {
                                        s.IsExpanded = true;
                                    }
                                    s.IsSelected = true;
                                }
                                else
                                { 
                                    if(s.IsExpanded)
                                    {
                                        foreach(CityViewModel c in s.Children)
                                        {
                                            bool c_exist = c.CityName.IndexOf(_searchText, StringComparison.InvariantCultureIgnoreCase) > -1;
                                            if(c_exist)
                                            {
                                                if(c.Parent != null)
                                                {
                                                    c.IsExpanded = true;
                                                }
                                                c.IsSelected = true;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            MessageBox.Show("no item!");
                        }
                    }
                }
                
            }
    readonly ICommand _searchCommand;
            string _searchText = String.Empty;
    
            public CountryViewModel(Region[] regions)
            {
                
                
                _regions = new ReadOnlyCollection<RegionViewModel>(
                    (from region in regions
                     select new RegionViewModel(region))
                    .ToList());
                _searchCommand = new SearchTreeViewItemCommand(this);
            }


    Best Regards,

    Xavier Eoro


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 ly_he 2015年5月1日 0:46
    2015年4月27日 8:08
    版主

全部回复

  • Hi ly_he,

    >>"该检索方法可以在动态加载节点的MVVM操控的WPF Treeview树上实现吗?"

    我觉得是可以实现的,只要有已加载的节点,就可以从已经存在的节点中查询或者匹配。

    >>"该方法可以在他文中所附示例的第二个项目“LoadOnDemand”上实现吗?"

    我花了点时间看了一下这个Demo,我的理解是动态加载的节点在进行检索时,先判断当前是否有节点存在,当有节点存在时,对节点进行匹配,如果当前节点全都不匹配,则判断子节点是否已加载或当前节点是否已展开,如果没有展开,则没有匹配的节点,如果当前节点已展开,则重复先前的匹配操作。这大致是我的思路,你可以参考一下。我写了个Sample,在CountryViewModel中需要定义命令,形式同你说的第一个Demo差不多,命令具体的执行方法是CountryViewModel中的PerformSearch()方法,CountryViewModel构造函数中需要实例化命令,代码段如下:

    void PerformSearch()
            {
                foreach(RegionViewModel r in _regions)
                {
                    bool exist = r.RegionName.IndexOf(_searchText, StringComparison.InvariantCultureIgnoreCase) > -1;
                    if (exist)
                    {
                        if (r.Parent != null)
                        {
                            r.Parent.IsExpanded = true;
                        }
                        r.IsSelected = true;
                    }
                    else
                    {
                        if (r.IsExpanded)
                        {
                            foreach(StateViewModel s in r.Children)
                            {
                                bool s_exist = s.StateName.IndexOf(_searchText, StringComparison.InvariantCultureIgnoreCase) > -1;
                                if (s_exist)
                                {
                                    if (s.Parent != null)
                                    {
                                        s.IsExpanded = true;
                                    }
                                    s.IsSelected = true;
                                }
                                else
                                { 
                                    if(s.IsExpanded)
                                    {
                                        foreach(CityViewModel c in s.Children)
                                        {
                                            bool c_exist = c.CityName.IndexOf(_searchText, StringComparison.InvariantCultureIgnoreCase) > -1;
                                            if(c_exist)
                                            {
                                                if(c.Parent != null)
                                                {
                                                    c.IsExpanded = true;
                                                }
                                                c.IsSelected = true;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            MessageBox.Show("no item!");
                        }
                    }
                }
                
            }
    readonly ICommand _searchCommand;
            string _searchText = String.Empty;
    
            public CountryViewModel(Region[] regions)
            {
                
                
                _regions = new ReadOnlyCollection<RegionViewModel>(
                    (from region in regions
                     select new RegionViewModel(region))
                    .ToList());
                _searchCommand = new SearchTreeViewItemCommand(this);
            }


    Best Regards,

    Xavier Eoro


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 ly_he 2015年5月1日 0:46
    2015年4月27日 8:08
    版主
  • 尊敬的Eoro先生,感谢您的及时答复,特别还提供了代码!我会好好的学习,再次感谢。


    ly_he

    2015年4月30日 1:09
  • 尊敬的Eoro先生。我根据您提供的Sample代码片断已成功实现了在第二个示例上的检索功能,真的特别感谢!

    我的最终想法是实现代码点位后的动态加载节点功能:就是一级一级的逐层定位,对定位成功的当前节点做3件事:1、如果没有展开,就看它是不是有真正的下位类,如果有,就展开,2、如果是占位用的哑节点,就调用IsExpand属性的LoadChildren方法,加载下位类;3、如果没有下位类,就停止。主要想实现检索功能和Josh示例中ViewModel中已有的动态加载功能有机结合。估计情况比检索已存在的节点稍微复杂,我先尝试一下,如果发现问题,还望得到您的进一步帮助!


    ly_he

    2015年5月1日 4:23
  • 我还有一个类似的问题想请教Eoro先生,但需要向您提供该问题的程序才比较说的清楚,不知道如何把打包的程序给你。我的email地址:ly_he@126.com


    ly_he

    2015年5月6日 11:04