2009-08-03 6 views
0

Я работаю с отсортированным WPF ListView, и я уже много сделал. Это не так сложно, потому что в Интернете уже много чего. Но есть немного информации, которую я все еще не хватает.Сортировка WPF ListView с DataTemplate вместо DisplayMemberBinding

колонкой так:

<GridViewColumn Width="200" Header="Fahrzeugname" DisplayMemberBinding="{Binding Name}"> 

я могу сортировать это так:

Binding columnBinding = column.DisplayMemberBinding as Binding; 

if (columnBinding != null) 
{ 
    sorts.Clear(); 
    sorts.Add(new SortDescription(columnBinding.Path.Path, direction)); 
    lastColumnSorted = column; 
} 

Но моя проблема, я не имею DisplayMemberBinding, поскольку я использую DataTemplate:

<DataTemplate> 
    <TextBlock Text="{Binding Name}" TextAlignment="Left"/> 
</DataTemplate> 

Как я могу получить имущество Binding является столбцом в коде C#?

ответ

2

Я написал набор вложенных свойств, чтобы делать то, что предложил Кент, вы можете проверить его here


EDIT: в соответствии с просьбой, вот пример команды для GridViewSort.Command:

private ICommand _sortCommand; 
    public ICommand SortCommand 
    { 
     get 
     { 
      if (_sortCommand == null) 
      { 
       _sortCommand = new RelayCommand(SortPersonsBy); 
      } 
      return _sortCommand; 
     } 
     set { _sortCommand = value; } 
    } 

    private void SortPersonsBy(object param) 
    { 
     string propertyName = param as string; 
     ICollectionView view = CollectionViewSource.GetDefaultView(_persons); 
     ListSortDirection direction = ListSortDirection.Ascending; 
     if (view.SortDescriptions.Count > 0) 
     { 
      SortDescription currentSort = view.SortDescriptions[0]; 
      if (currentSort.PropertyName == propertyName) 
      { 
       if (currentSort.Direction == ListSortDirection.Ascending) 
        direction = ListSortDirection.Descending; 
       else 
        direction = ListSortDirection.Ascending; 
      } 
      view.SortDescriptions.Clear(); 
     } 
     if (!string.IsNullOrEmpty(propertyName)) 
     { 
      view.SortDescriptions.Add(new SortDescription(propertyName, direction)); 
     } 
    } 

(он фактически реализует то же поведение, что и в случае, когда для GridViewSort.AutoSort установлено значение true ...)

+0

Отличная статья! Образец для GridViewSort.Command будет в порядке. Поскольку я не так разбираюсь в этой теме. – TalkingCode

+0

Я обновил свой ответ, чтобы добавить образец –

+0

Спасибо, я посмотрю на это. – TalkingCode

0

Зачем вы пытаетесь сделать это автоматически? Почему бы не предоставить вложенное свойство, которое пользователи могут настроить для определения свойства, с помощью которого следует сортировать столбец?

<GridViewColumn s:SortableColumn.SortBy="{Binding Name}" ...> 

Таким образом, вы предлагаете больше свободы реализации, а код будет быстрее и надежнее.

0

встроенный способ WPF будет использовать ICollectionView.

ICollectionView view = CollectionViewSource.GetDefaultView(yourItemsSourceList); 
if(view.CanSort) 
{ 
    view.SortDescriptions.Add(...) 
} 
0

Я столкнулся с аналогичной WPF ListView/Gridview сортировки проблемы и у меня есть некоторые контрсилы, что делает его трудно реализовать Csharp решения при условии. По сути, у меня есть существующее приложение ASP.NET с тысячами строк отлаженного кода VB, а также рабочий SQL для базы данных с более чем 100 таблицами и очень сложными объединениями. Я должен написать Windows .exe на основе одного и того же приложения, но я хочу использовать WPF для реализации аналогичного графического взгляда &.

Закончив с отказом от ответственности, я столкнулся с проблемой сортировки и обыскал Интернет для всех замечательных общих понятий, подобных приведенным выше, и попытался преобразовать их из CS в VB. Я опытный программист, но я обнаружил, что это было просто не в моих силах, поэтому я перевернул и разработал свой собственный вид. Вероятно, это пугает пуристов, но я прагматик, и коммерческое приложение имеет приоритет.

Чтобы отсортировать сетку, я решил использовать события мыши в заголовках столбцов. DoubleClick для восходящих сортировок и MouseRightButtonUp для спуска.

<GridViewColumn Header="Project Name &#160;&#160;" Width="300" > 

Private Sub ListViewGrid_MouseDoubleClick(
    ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles ListingDG.MouseDoubleClick 

    Try 
     Dim mouseHdrClick As String = DirectCast(DirectCast(e.OriginalSource, System.Object), System.Windows.Controls.TextBlock).Text 
     Dim SqlOrderBy As String = "" 

     Select Case UCase(mouseHdrClick.Trim) 
      Case UCase("Product Name") 
       SqlOrderBy = " ORDER BY Product_Name" 

Затем я просто перезаряжаю ListViewGrid с помощью строковой переменной SqlOrderBy.Единственная проблема, с которой я столкнулся, заключалась в том, что я был вынужден щелкнуть текст заголовка в заголовке столбца, чтобы он работал. Я решил, что просто добавив символ пространства XML (&#160;), чтобы заполнить ширину столбца. Команда .Trim снова очищает их для работы Select Case. Я до сих пор не понял, как добавить маленькие стрелки вверх и вниз, но функциональность - это то, что считается здесь, так как это просто косметические штрихи прямо сейчас.

<GridViewColumn Header="Project Name &#160;&#160;" Width="300"> 

Наконец, позвольте мне добавить, что я прекрасно понимаю, что если я изменить структуру Gridview это приведет текст заголовка, чтобы двигаться в другом месте в OriginalSource, но это вопрос я могу жить с сейчас. Я знаю, что это быстрый грязный обходной путь, и, вероятно, есть намного лучшие альтернативы, поэтому любые рекомендации будут оценены.

Смежные вопросы