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}}"/>