2009-03-02 6 views
0

Примера проблемы:WPF ListBox ListCollectionView анонимного типа навигация проблема

Структура: WPF Визуальный контроль: DataGrid из 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(); 
} 

сетка данных курсор не изменяет положение 1, если изменить значение одного из анонимных типов:

var listView = new ListCollectionView(
    new[] 
    { 
     new 
     { 
     Bool = false, 
     Str = "Value1" 
     }, 
     new 
     { 
      Bool = false, 
      Str = "Value2" 
     } 
    }.ToList()); 

Курсор работает правильно и SelectedIndex = 1.

Я думаю, что это происходит из-за анонимного переопределения объекта GetHashCode() Для анонимного объекта GetHashCode: сумма всех полей. Если поля одинаковы для двух разных экземпляров анонимных объектов, GetHashCode() вернет одинаковое значение для обоих экземпляров.

Возможно, DataGrid внутренне сравнивает объекты с использованием GetHashCode и не меняет SelectedPosition.

Кто-нибудь знает, как избежать этой проблемы? Назначения анонимных объектов для DataGrid является обязательным требованием, я не могу создать строго типизированные объекты, а это значит, что я должен создать оболочку для объекта и автоматической генерацией столбцов:

public class ViewItemHodler 
{ 
    public object ViewItem { get; set; } 
} 

Благодарность

ответ

2

Там является CustomSort свойство на DataGrid, которое вы можете установить для реализации IComparer<T>, что позволит вам реализовать заказ пользовательского сортировки для ваших анонимных типов. Существует больше информации о собственности CustomSort здесь:

http://blogs.msdn.com/jgoldb/archive/2008/08/26/improving-microsoft-datagrid-ctp-sorting-performance.aspx

Что вы хотите сделать, это на самом деле создать класс оболочки, который принимает Comparer<T> делегата, а затем вызывает, что в реализации IComparer<T>.Compare.

Таким образом, вы можете использовать var, чтобы объявить экземпляр (поскольку вы не знаете, что T) в вашем коде, который создает анонимный тип.

Идея, что вы связаны с анонимными типами и не может создавать сильно типизированные объекты, немного смехотворна. Вы не создаете анонимные запросы из источника, который неизвестен во время компиляции, поэтому я не понимаю, почему ограничение на анонимные типы.