使用xaml显示项目层次结构

时间:2012-10-24 04:19:15

标签: c# wpf

我有一个从这样的类创建的对象层次结构:

public class MyTreeItem
{
    public MyTreeItem Parent{get;set}
    public IList<MyTreeItem> Children{get;set;}
    public string Description{get;set;}
    //Other properties.
}

假设我有一个MyTreeItem s的对象树,如下所示:

    A
   / \
  B   C
 /\    \
D  E    F

在我的程序中,我将从数据库查询中获取上述层次结构中的某个对象。此项目将属于树的第二级或第三级(在本例中为B, C, D, E or F)。我想使用Parent属性显示所获取对象的完整树路径(类似于在Windows资源管理器中显示路径的方式)。假设我选择了项B,那么路径应显示为A -> B。如果我选择E,则路径应为A -> B -> E。有没有办法在XAML中完成这项工作?

2 个答案:

答案 0 :(得分:0)

所以,如果你想将它显示为一个字符串,那么你需要做的就是设计一个属性,该属性返回基于父级的痕迹痕迹......

注意:这假定'A'和'B'是Description属性......

public string Breadcrumb
{
    get
    {
        string breadcrumb = Description;

        if(Parent === null)
            return breadcrumb;

        for(MyTreeItem currentItem = Parent; currentItem != null ; currentItem = currentItem.Parent)
        {
            breadcrumb = string.Format("{0) -> {1}", currentItem.Description, breadcrumb);
        }

        return breadcrumb;
    }
}

基本上逻辑是继续在当前痕迹的前面添加父的描述(用->格式化),然后for循环将currentItem设置为Parent (在顶层应该为空)

例如,对于Node E,它将构建如下的痕迹:

  

循环0:E
  环1:B - &gt; Ë
  循环2:A - &gt; B - &gt; ë

答案 1 :(得分:0)

如何使用IValueConverter并将其绑定到TextBlock文本DP。

public class MyConverter : IValueConverter
{
   public object Convert(object value, Type targetType, object parameter, 
                                      System.Globalization.CultureInfo culture)
   {
      string hierarchy = String.Empty;
      if(value != DependencyProperty.UnsetValue)
      {
         MyTreeItem item = value;
         hierarchy = value.Description;
         MyTreeItem parentItem = item.Parent;
         while(parentItem != null)
         {
            hierarchy = string.Format("{0) -> {1}", parentItem.Description, 
                                                       hierarchy);
            parentItem = parentItem.Parent;
         }
      }
      return hierarchy;
   }

   public object ConvertBack(object value, Type targetType, object parameter,
                                  System.Globalization.CultureInfo culture)
   {
      throw new NotImplementedException();
   }
}

这是你的XAML -

<TextBlock Text="{Binding SelectedItem,
                          Converter={StaticResource MyConverter}}"/>