C# 排序项基于DataTemplate XAML中声明性定义的属性控制项
我正在寻找一种简单的方法,根据隐式DataTemplate中为控件绑定到的项指定的属性对ItemsControl的项进行排序。在这里定义DataTemplate上的属性是至关重要的,因为我无法在项本身上添加排序属性 因此,对于以下示例VM层: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;
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类更改
是的,这也是我的猜测。不过我想找一个更简单的方法。
<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>