我花了两周的时间试图找出一种方法,以相反的顺序显示列表框中的项目,而不使用任何排序属性,并且不在我的实体中放置任何表示逻辑,我只是希望最后插入的项目显示在列表框的顶部。 我发现的唯一纯XAML解决方案是WPF reverse ListView,但它不是那么优雅。我还试图覆盖我的BindableCollection的GetEnumerator()(我使用Caliburn Micro作为MVVM框架)来返回一个枚举器,它以相反的顺序迭代我的集合项,但是id不起作用。 我该怎么办?
答案 0 :(得分:2)
ScaleTransform是针对这种特殊情况的优雅解决方案,但可能存在更多通用应用程序(例如绑定相同的列表但应用了不同的排列)。
如果确保将绑定考虑到列表而不是列表的元素,则可以使用转换器完成所有操作。假设您使用ObservableCollection字符串(确定可以使用泛型和反射来使其更优雅)并错过所有正确的异常处理编码和多次调用Convert ...
public class ReverseListConverter : MarkupExtension, IValueConverter
{
private ObservableCollection<string> _reversedList;
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
_reversedList = new ObservableCollection<string>();
var data = (ObservableCollection<string>) value;
for (var i = data.Count - 1; i >= 0; i--)
_reversedList.Add(data[i]);
data.CollectionChanged += DataCollectionChanged;
return _reversedList;
}
void DataCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
var data = (ObservableCollection<string>)sender;
_reversedList.Clear();
for (var i = data.Count - 1; i >= 0; i--)
_reversedList.Add(data[i]);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
然后,您可以在XAML中使用类似
的内容进行绑定<ListBox ItemsSource="{Binding Converter={ReverseListConverter}}"/>