Exemple de problème:WPF ListBox ListCollectionView problème de navigation type anonyme
Cadre: WPF Contrôle visuel: DataGrid de CodePlex
public Window()
{
InitializeComponent();
var listView = new ListCollectionView(
new[]
{
new
{
Bool = false,
Str = "Value1"
},
new
{
Bool = false,
Str = "Value1"
}
}.ToList());
dataGrid.ItemsSource = listView;
listView.MoveCurrentToFirst();
listView.MoveCurrentToNext();
}
Le curseur DataGrid ne change pas de position à 1, si le changement d'une valeur d'un des types anonymes:
var listView = new ListCollectionView(
new[]
{
new
{
Bool = false,
Str = "Value1"
},
new
{
Bool = false,
Str = "Value2"
}
}.ToList());
curseur fonctionne correctement et SelectedIndex = 1.
Je pense que cela arrive à cause d'un remplacement d'objet anonyme GetHashCode() Pour un objet anonyme GetHashCode: somme de tous les champs. Si les champs sont identiques pour 2 instances différentes d'objets anonymes, GetHashCode() retournera la même valeur pour les deux instances.
Peut-être DataGrid compare-t-il en interne les objets à l'aide de GetHashCode et ne modifie pas SelectedPosition.
Est-ce que quelqu'un sait comment éviter ce problème? Attribution des objets anonymes à DataGrid est nécessaire, je ne peux pas créer des objets fortement typés, ce qui signifie que je dois créer une enveloppe pour l'objet et autogenerate les colonnes:
public class ViewItemHodler
{
public object ViewItem { get; set; }
}
Merci