【问题标题】:Displaying item hierarchy using xaml使用 xaml 显示项目层次结构
【发布时间】:2012-10-14 02:59:45
【问题描述】:

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

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

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

    A
   / \
  B   C
 /\    \
D  E    F

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

【问题讨论】:

  • 你想怎么显示?作为显示路径的字符串还是作为树视图?
  • 最好是字符串。但如果前者是不可能的,即使是TreeView 也可以。我想我可以通过使用MultiBinding 来使用TextBlock 来完成这项工作,但我不知道如何处理两个不同深度的对象。

标签: c# wpf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    注意:这里假设“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;
        }
    }
    

    基本上,逻辑是在当前面包屑的前面继续添加父级的描述(格式为-&gt;),然后for 循环会将 currentItem 设置为Parent(在顶层)

    例如,对于节点 E,它将这样构建面包屑:

    循环 0:E
    循环 1:B -> E
    循环 2:A -> B -> E

    【讨论】:

    • 谢谢,但我想知道这是否可以在不借助代码隐藏和纯粹在 XAML 中完成。请参阅我的问题。
    • 我会说你可能做不到。如果您想使用树视图显示它,请使用TreeView 控件和HierachicalDataTemplate,但除此之外,我认为这在 XAML 中是不可能的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2018-08-21
    相关资源
    最近更新 更多