Silverlight treeview控件选择最后一个节点并查找父节点?

Silverlight treeview控件选择最后一个节点并查找父节点?,silverlight,Silverlight,如果我创建了一个silverlight应用程序,并将Treeview控件与HierarchycalDataTemplate一起使用,其中包含一个父节点,然后是父节点下的一个子节点,然后是第一个子节点下的另一个子节点。 如果单击最后一个子节点,如何获取返回父节点的路径 母公司 Child1 Child2 ChildA Child3 因此,如果我有这个树状视图,我点击了“ChildA”,有没有办法显示路径是Parent-Child2-ChildA 谢谢你马特。。

如果我创建了一个silverlight应用程序,并将Treeview控件与HierarchycalDataTemplate一起使用,其中包含一个父节点,然后是父节点下的一个子节点,然后是第一个子节点下的另一个子节点。 如果单击最后一个子节点,如何获取返回父节点的路径

  • 母公司

      Child1
      Child2
             ChildA
      Child3
    
因此,如果我有这个树状视图,我点击了“ChildA”,有没有办法显示路径是Parent-Child2-ChildA
谢谢你

马特。。。我相信,如果您有适当的父子链接(正如您在问题中提到的那样)&然后在use单击树的任何节点时使用递归调用,那么这应该可以达到您的目的。你可以试试下面的逻辑

用户体验-


代码隐藏-

namespace SilverlightApplication1
{
public class Group : INotifyPropertyChanged
{
    private String _strItemName;
    private Int32 _itemId;
    private ObservableCollection<Group> _subItems;

    public String ItemName
    {
        get { return _strItemName; }
        set { _strItemName = value; NotifyChange("ItemName"); }
    }

    public Int32 ItemID
    {
        get { return _itemId; }
        set { _itemId = value; NotifyChange("ItemID"); }
    }

    public ObservableCollection<Group> SubItems
    {
        get { return _subItems; }
        set { _subItems = value; NotifyChange("SubItems"); }
    }

    /// <summary>
    /// Called whenever any of the Group property is changed.
    /// </summary>
    /// <param name="PropertyName">Name of the property that has changed.</param>
    private void NotifyChange(String PropertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

public partial class MainPage : UserControl
{
    private ObservableCollection<Group> _lstItems;
    private Int32 _selectedItemId;

    public MainPage()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(MainPage_Loaded);
    }

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        _lstItems = new ObservableCollection<Group>();

        ObservableCollection<Group> childA = new ObservableCollection<Group>();
        childA.Add(new Group { ItemID = 1, ItemName = "ChildA", SubItems = null });

        ObservableCollection<Group> parent = new ObservableCollection<Group>();
        parent.Add(new Group { ItemID = 2, ItemName = "Child1", SubItems = null });
        parent.Add(new Group { ItemID = 3, ItemName = "Child2", SubItems = childA });
        parent.Add(new Group { ItemID = 4, ItemName = "Child3", SubItems = null });

        _lstItems.Add(new Group { ItemID = 5, ItemName = "Parent", SubItems = parent });

        tvGroups.ItemsSource = _lstItems;
    }

    private void TextBlock_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        TextBlock txbSource = sender as TextBlock;
        String strItems = String.Empty;
        if (txbSource != null)
        {
            _selectedItemId = -1;
            Int32.TryParse(txbSource.Tag.ToString(), out _selectedItemId);
            List<String> lstParent = new List<String>();
            if (_selectedItemId != -1)
            {
                lstParent = FindItem(_lstItems);
            }
            lstParent.Reverse();
            foreach(String strItem in lstParent)
            {
                strItems += strItem + " -> ";
            }
            strItems = strItems.Remove(strItems.Length - 4);
        }

        txbParentToChild.Text = strItems;
    }

    private List<String> FindItem(ObservableCollection<Group> lstCurrentGroup)
    {
        List<String> lstParent = new List<String>();
        foreach(Group grp in lstCurrentGroup)
        {
            if (grp.ItemID == _selectedItemId)
            {
                lstParent.Add(grp.ItemName);
                return lstParent;
            }
            else if (grp.SubItems != null)
            {
                lstParent = FindItem(grp.SubItems);
                if (lstParent.Count > 0)
                    lstParent.Add(grp.ItemName);
            }
        }
        return lstParent;
    }
}
}
名称空间SilverlightApplication1
{
公共类组:INotifyPropertyChanged
{
私有字符串_strItemName;
私有Int32_itemId;
私有可观测集合_子项;
公共字符串ItemName
{
获取{return\u strItemName;}
设置{u strItemName=value;NotifyChange(“ItemName”);}
}
公共Int32项目ID
{
获取{return\u itemId;}
设置{u itemId=value;NotifyChange(“itemId”);}
}
公共可观测集合子项
{
获取{return\u subItems;}
设置{u subItems=value;NotifyChange(“subItems”);}
}
/// 
///每当更改任何组属性时调用。
/// 
///已更改的属性的名称。
私有void NotifyChange(字符串PropertyName)
{
if(PropertyChanged!=null)
PropertyChanged(这是新的PropertyChangedEventArgs(PropertyName));
}
#区域INotifyProperty更改成员
公共事件属性更改事件处理程序属性更改;
#端区
}
公共部分类主页面:UserControl
{
私人可观测收集项目;
私有Int32 _selectedItemId;
公共主页()
{
初始化组件();
已加载+=新路由EventHandler(主页面_已加载);
}
已加载无效主页(对象发送器、路由目标)
{
_lstItems=新的ObservableCollection();
ObservableCollection childA=新的ObservableCollection();
Add(新组{ItemID=1,ItemName=“childA”,SubItems=null});
ObservableCollection父项=新的ObservableCollection();
添加(新组{ItemID=2,ItemName=“Child1”,SubItems=null});
添加(新组{ItemID=3,ItemName=“Child2”,SubItems=childA});
添加(新组{ItemID=4,ItemName=“Child3”,SubItems=null});
_添加(新组{ItemID=5,ItemName=“Parent”,SubItems=Parent});
tvGroups.ItemsSource=lstItems;
}
私有void TextBlock_MouseLeftButtonUp(对象发送器,MouseButtonEventArgs e)
{
TextBlock txbSource=发送方为TextBlock;
String strItems=String.Empty;
如果(txbSource!=null)
{
_选择editemid=-1;
Int32.TryParse(txbSource.Tag.ToString(),out _selectedItemId);
List LSTPRENT=新列表();
如果(_selectedItemId!=-1)
{
lstParent=FindItem(lstuitems);
}
lstParent.Reverse();
foreach(父项中的字符串strItem)
{
strItems+=strItem+“->”;
}
strItems=strItems.Remove(strItems.Length-4);
}
txbParentToChild.Text=strItems;
}
私有列表FindItem(ObservableCollection lstCurrentGroup)
{
List LSTPRENT=新列表();
foreach(当前组中的组grp)
{
如果(grp.ItemID==\u selectedItemId)
{
lstParent.Add(grp.ItemName);
返回父母;
}
else if(grp.SubItems!=null)
{
LSTPRENT=FindItem(组分项);
如果(lstParent.Count>0)
lstParent.Add(grp.ItemName);
}
}
返回父母;
}
}
}

上面的代码在用户单击树的节点时在文本块中显示父节点到叶节点的链接

你可以,但不是那么容易。您应该将树视图绑定到视图模型列表,并且每个视图模型都应该具有IsSelected属性和ParentViewModel属性。您应该以这种方式重写应用程序。请查看Silverlight控件工具包中的TreeViewExtensions或此处提到的Justin Angel的扩展:因为WPF显然不太关心家长问题(孩子不应该知道自己是家长,但家长应该知道自己是孩子),我建议,如果您可以为类本身提供父属性,甚至可以是对象,那么它将是“最干净”的解决方案。
namespace SilverlightApplication1
{
public class Group : INotifyPropertyChanged
{
    private String _strItemName;
    private Int32 _itemId;
    private ObservableCollection<Group> _subItems;

    public String ItemName
    {
        get { return _strItemName; }
        set { _strItemName = value; NotifyChange("ItemName"); }
    }

    public Int32 ItemID
    {
        get { return _itemId; }
        set { _itemId = value; NotifyChange("ItemID"); }
    }

    public ObservableCollection<Group> SubItems
    {
        get { return _subItems; }
        set { _subItems = value; NotifyChange("SubItems"); }
    }

    /// <summary>
    /// Called whenever any of the Group property is changed.
    /// </summary>
    /// <param name="PropertyName">Name of the property that has changed.</param>
    private void NotifyChange(String PropertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

public partial class MainPage : UserControl
{
    private ObservableCollection<Group> _lstItems;
    private Int32 _selectedItemId;

    public MainPage()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(MainPage_Loaded);
    }

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        _lstItems = new ObservableCollection<Group>();

        ObservableCollection<Group> childA = new ObservableCollection<Group>();
        childA.Add(new Group { ItemID = 1, ItemName = "ChildA", SubItems = null });

        ObservableCollection<Group> parent = new ObservableCollection<Group>();
        parent.Add(new Group { ItemID = 2, ItemName = "Child1", SubItems = null });
        parent.Add(new Group { ItemID = 3, ItemName = "Child2", SubItems = childA });
        parent.Add(new Group { ItemID = 4, ItemName = "Child3", SubItems = null });

        _lstItems.Add(new Group { ItemID = 5, ItemName = "Parent", SubItems = parent });

        tvGroups.ItemsSource = _lstItems;
    }

    private void TextBlock_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        TextBlock txbSource = sender as TextBlock;
        String strItems = String.Empty;
        if (txbSource != null)
        {
            _selectedItemId = -1;
            Int32.TryParse(txbSource.Tag.ToString(), out _selectedItemId);
            List<String> lstParent = new List<String>();
            if (_selectedItemId != -1)
            {
                lstParent = FindItem(_lstItems);
            }
            lstParent.Reverse();
            foreach(String strItem in lstParent)
            {
                strItems += strItem + " -> ";
            }
            strItems = strItems.Remove(strItems.Length - 4);
        }

        txbParentToChild.Text = strItems;
    }

    private List<String> FindItem(ObservableCollection<Group> lstCurrentGroup)
    {
        List<String> lstParent = new List<String>();
        foreach(Group grp in lstCurrentGroup)
        {
            if (grp.ItemID == _selectedItemId)
            {
                lstParent.Add(grp.ItemName);
                return lstParent;
            }
            else if (grp.SubItems != null)
            {
                lstParent = FindItem(grp.SubItems);
                if (lstParent.Count > 0)
                    lstParent.Add(grp.ItemName);
            }
        }
        return lstParent;
    }
}
}