C# 排序项基于DataTemplate XAML中声明性定义的属性控制项

C# 排序项基于DataTemplate XAML中声明性定义的属性控制项,c#,wpf,sorting,mvvm,itemscontrol,C#,Wpf,Sorting,Mvvm,Itemscontrol,我正在寻找一种简单的方法,根据隐式DataTemplate中为控件绑定到的项指定的属性对ItemsControl的项进行排序。在这里定义DataTemplate上的属性是至关重要的,因为我无法在项本身上添加排序属性 因此,对于以下示例VM层: public interface INamed { string Name { get; set; } } public class FirstModel : INamed { public string Name { get; set;

我正在寻找一种简单的方法,根据隐式DataTemplate中为控件绑定到的项指定的属性对ItemsControl的项进行排序。在这里定义DataTemplate上的属性是至关重要的,因为我无法在项本身上添加排序属性

因此,对于以下示例VM层:

public interface INamed
{
    string Name { get; set; }
}

public class FirstModel : INamed
{
    public string Name { get; set; }
}

public class SecondModel : INamed
{
    public string Name { get; set; }
}

public class ViewModel
{
    public ViewModel()
    {
        Models = new INamed[] { new SecondModel {Name = "Second"}, new FirstModel {Name = "First"}};
    }

    public IEnumerable<INamed> Models { get; private set; }
}
我有以下数据模板定义(过于简化):


姓名:
第二个人的名字:
在某些地方,用法如下:

<ItemsControl ItemsSource="{Binding Models}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" IsItemsHost="True" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

在这里,项目的顺序应该基于我为数据模板定义的附加属性。在这里看不到任何直接使用CollectionViewSource的选项,可能是我错了

我认为目前的选择并不太吸引人,包括:

  • 附加ItemsControl上的行为,遍历每个新项的可视树,并根据找到的SortOrder值对项进行排序
  • 一个自定义项控件,具有自己的排序逻辑、面板、21点和。。。你知道吗
  • 将模型实例包装在某种代理中,并在其上具有SortOrder属性。这仍然需要一些自定义/用户控制代码或ViewModel类更改
有没有更好/更容易让我错过的方法?

我想你不能 我认为唯一的方法是实现您自己的ItemsControl 或者用另一个类包装模型

也许这有助于:
是的,这也是我的猜测。不过我想找一个更简单的方法。
<DataTemplate DataType="{x:Type local:FirstModel}">
    <StackPanel Background="Red" local:AttachedProperties.SortOrder="1">
        <Label>First's Name:</Label>
        <TextBlock Text="{Binding Name}" />
    </StackPanel>
</DataTemplate>

<DataTemplate DataType="{x:Type local:SecondModel}">
    <StackPanel Background="Green" local:AttachedProperties.SortOrder="2">
        <Label>Second's Name:</Label>
        <TextBlock Text="{Binding Name}" />
    </StackPanel>
</DataTemplate>
<ItemsControl ItemsSource="{Binding Models}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" IsItemsHost="True" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>