Tri d'une combobox purement en XAML
Je suis surpris que personne ne l'ait demandé auparavant ici... au moins, je n'ai pas trouvé de réponse ici ou ailleurs, en fait.
J'ai une liste déroulante qui est liée à une ObservableCollection. Tout a bien fonctionné jusqu'à ce que les gars voulaient le contenu trié. Pas de problème - je finis par changer la propriété simple:
public ObservableCollection<string> CandyNames { get; set; } // instantiated in constructor
Pour quelque chose comme ceci:
private ObservableCollection<string> _candy_names; // instantiated in constructor
public ObservableCollection<string> CandyNames
{
get {
_candy_names = new ObservableCollection<string>(_candy_names.OrderBy( i => i));
return _candy_names;
}
set {
_candy_names = value;
}
}
, Ce post est vraiment deux questions en une:
- Comment puis-je trier une simple ComboBox de chaînes en XAML uniquement . J'ai fait des recherches et je ne peux trouver que des informations sur une classe SortDescription, et c'est l'implémentation la plus proche que j'ai pu trouver, mais ce n'était pas pour une liste déroulante.
- Une fois que j'ai implémenté le tri dans code-behind, ma liaison de données a été cassée; quand j'ai ajouté de nouveaux éléments à ObservableCollection, les éléments ComboBox ne se sont pas mis à jour! Je ne vois pas comment cela s'est passé, car je n'ai pas attribué de nom à ma liste déroulante et je ne l'ai pas manipulé directement, ce qui est ce qui casse généralement la liaison.
Merci pour votre aide!
24
demandé sur
Dave
2010-02-16 20:00:29
1 réponses
Vous pouvez utiliser une CollectionViewSource pour effectuer le tri dans XAML, mais vous devez actualiser sa vue si la collection sous-jacente change.
XAML:
<Window x:Class="CBSortTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
Height="300" Width="300">
<Window.Resources>
<CollectionViewSource Source="{Binding Path=CandyNames}" x:Key="cvs">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Window.Resources>
<StackPanel>
<ComboBox ItemsSource="{Binding Source={StaticResource cvs}}" />
<Button Content="Add" Click="OnAdd" />
</StackPanel>
</Window>
Code derrière:
using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Data;
namespace CBSortTest
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
CandyNames = new ObservableCollection<string>();
OnAdd(this, null);
OnAdd(this, null);
OnAdd(this, null);
OnAdd(this, null);
DataContext = this;
CandyNames.CollectionChanged +=
(sender, e) =>
{
CollectionViewSource viewSource =
FindResource("cvs") as CollectionViewSource;
viewSource.View.Refresh();
};
}
public ObservableCollection<string> CandyNames { get; set; }
private void OnAdd(object sender, RoutedEventArgs e)
{
CandyNames.Add("Candy " + _random.Next(100));
}
private Random _random = new Random();
}
}
17
répondu
Wallstreet Programmer
2010-02-16 17:40:31