【问题标题】:How do I sort a WPF TreeView using the HierarchicalDataTemplate for EntityCollection objects?如何使用 EntityCollection 对象的 HierarchicalDataTemplate 对 WPF TreeView 进行排序?
【发布时间】:2011-09-03 14:57:09
【问题描述】:

我的 网页 是一个实体框架实体。这些绑定到 WPF TreeView。我想订购 Sort 属性的 TreeView 中显示的所有 网页

代码

EDMX

它的 Subordinates 属性返回零个或多个网页的集合。

XAML

<TreeView Name="TreeViewWebpages">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Webpage}"
                                  ItemsSource="{Binding Subordinates}">
            <TextBlock Text="{Binding Path=Title}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

C#

TreeViewWebpages.ItemsSource = from Webpage root in db.Webpages.Include("Subordinates")
                               where root.Dominant == null
                               select root;

结果

网页在 TreeView 中是无序的。

问题

如何更改此设置以对 Sort 属性的 TreeView 中显示的所有 网页 进行排序?


更新

这个 ValueConverter 似乎可以工作(谢谢@KP Adrian 和@IVerzin)。有没有更好的办法?

XAML

ItemsSource="{Binding Path=Subordinates, Converter={local:SortConverter}}"

C#

[ValueConversion(typeof(EntityCollection<Webpage>), typeof(EntityCollection<Webpage>))]
public class SortConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((EntityCollection<Webpage>)value).OrderBy(o => o.Sort);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

【问题讨论】:

  • 如果要同时对顶级页面和下级页面进行排序,请使用值转换器:stackoverflow.com/questions/5722835/…
  • 是的,EntityCollection 没有实现 IList,但您可以将值转换为 EntityCollection 的实例并在其上调用 ToList()。 -- System.Collections.IList collection = (value as EntityCollection).ToList();
  • 请注意,这只有在您有一个 HierarchicalDataTemplate 时才会有效。如果您有多个由 DataType 属性选择的 HierarchicalDataTemplate,则使用此方法将对列表进行多次排序,这可能会减慢速度。我还没有找到绕过这个问题的解决方案。

标签: wpf entity-framework sorting treeview hierarchicaldatatemplate


【解决方案1】:

假设您的 Sort 属性是您在运行时用来确定顺序的字符串或整数,您可以在表达式中添加 orderby 部分。

TreeViewWebpages.ItemsSource = from Webpage root in db.Webpages.Include("Subordinates")
                           where root.Dominant == null
                           orderby root.Sort
                           select root;

【讨论】:

  • 这不命令下属。或下属的下属。
  • 您没有提到要在所有级别进行排序。正如我上面评论的那样,我会推荐一个价值转换器解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2011-08-19
相关资源
最近更新 更多