使用XAML显示项目层次结构



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

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

假设我有一个MyTreeItem的对象树,例如以下内容:

    A
   / 
  B   C
 /    
D  E    F

在我的程序中,我将从DB查询中以上层次结构中获取一些对象。该项目将属于树的第二或第三级(在这种情况下为B, C, D, E or F)。我想使用Parent属性显示获得对象的完整树路径(就像Windows Explorer中显示的路径一样)。假设我选择了项目B,然后应将路径显示为A -> B。如果选择E,则该路径应为A -> B -> E。有没有办法在XAML?

中完成此操作

因此,如果您想将其显示为字符串,那么您需要做的就是设计一个属性,该属性是根据父的返回面包屑步道...

注意:这假设" A"one_answers" 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(应为最高级别)p>例如,对于节点E,它将建立面包屑:

循环0:e
循环1:b-> e
循环2:a-> b-> e

如何使用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}}"/>

最新更新