Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/60: Рейтинг темы: голосов - 60, средняя оценка - 4.82
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107

Группировка и сортировка привязанных изменяющихся данных

30.10.2009, 20:15. Показов 11743. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В данный момент разбираюсь в привязке данных в WPF. ИМХО, как это реализовано - мрак, ну да приходится мириться и пользоваться тем, что есть.
Последнее, о чем прочитал - Сортировка и Группировка привязанных данных. До этого много пришлось танцевать с бубном, что бы добиться автообновления ListBox при добавлении/удалении элементов в связанную коллекцию, а так же изменении их содержимого.
Коллекцию пришлось разместить в классе ObservableCollection, базовый класс с данными унаследовал интерфейс INotifyPropertyChanged. Отдельного разговора стоит история, как я потом переходил на темплейты, но сейчас хочу спросить о такой проблеме:

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

Раньше пришло применить интерфейс INotifyPropertyChanged именно потому, что контрол не отображал измененное поле, но в ситуации с сортировкой и группировкой этот прием не дает желаемого эффекта . Кто знает как побороть эту новую напасть?

Привожу весь код, а заодно и проект выкладываю, так как мне пока попадалось толко одно похожее решение, а задача достаточно жизненная.

C#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.ComponentModel;
 
namespace Practice
{
  /// <summary>
  /// Interaction logic for Window1.xaml
  /// </summary>
  /// 
  public partial class Window1:Window
  {
    TestCollection list;
    TestClass[] a= new TestClass[]{ new TestClass("Иванов И.И.","somewhere1",true),
        new TestClass("Petrov P.P.","somewhere2"),
        new TestClass("Sidorov S.S.","somewhere3"),
        new TestClass("Smirnova L.D.","somewhere4")};
    private static int index=0;
 
    public Window1()
    {
      InitializeComponent();
      list=new TestCollection();
      list.Add(a[0]);
      myListBox.ItemsSource=list.List;
    }
 
    private void Button_Click(object sender,RoutedEventArgs e)
    {
      if (index<(a.Length-1))
      {
        list.Add(a[++index]);
      }
    }
 
    private void Button_Click_1(object sender,RoutedEventArgs e)
    {
      list.FixPerson(index);
    }
  }
 
  public class TestClass:INotifyPropertyChanged
  {
    public TestClass(string fio,string adress):this(fio,adress,false)
    {
    }
 
    public TestClass(string fio,string adress,bool fix)
    {
      this.fio=fio;
      this.adress=adress;
      this.fix=fix;
    }
 
    //INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    private void raisePropertyChanged(string propertyName)
    {
      if (PropertyChanged!=null)
        PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
    }
 
    private bool fix=false;
    public bool Fix
    {
      get { return fix; }
      set
      {
        fix=value;
        raisePropertyChanged("Fix");
        raisePropertyChanged("FIO");
      }
    }
 
    private string fio;
    public string FIO
    {
      get
      {
        if (fix)
          return "(fixed) "+fio;
        else
          return fio;
      }
    }
 
    private string adress;
    public string Adress { get { return adress; } }
  }
 
  public class TestCollection
  {
    private ObservableCollection<TestClass> list=new ObservableCollection<TestClass>();
    public ObservableCollection<TestClass> List
    {
      get { return list; }
    }
 
    public TestCollection()
    {
      ICollectionView view=CollectionViewSource.GetDefaultView(list);
      view.SortDescriptions.Add(new SortDescription("FIO",ListSortDirection.Ascending));
      view.GroupDescriptions.Add(new PropertyGroupDescription("Fix",new FixGrouper()));
    }
 
    public class FixGrouper:IValueConverter
    {
      public object Convert(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture)
      {
        if ((bool)value)
          return "Clicked";
        else
          return "Not Clicked";
      }
 
      public object ConvertBack(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture)
      {
        throw new NotImplementedException();
      }
    }
 
    public void Add(TestClass person)
    {
      list.Add(person);
    }
 
    public void FixPerson(int index)
    {
      list[index].Fix=true;
    }
  }
}
XAML
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<Window x:Class="Practice.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Practice"    
    Title="Window1" Height="300" Width="300">
  <Window.Resources>
    <DataTemplate x:Key="ListboxTemplate">
      <Border Name="border" BorderBrush="Aqua" BorderThickness="1"
              Padding="5" Margin="5">
        <Grid>
          <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
          </Grid.ColumnDefinitions>
 
          <TextBlock Grid.Row="0" Grid.Column="0">FIO:</TextBlock>
          <TextBlock Grid.Row="0" Grid.Column="1" HorizontalAlignment="Left" Text="{Binding Path=FIO}"></TextBlock>
          <TextBlock Grid.Row="1" Grid.Column="0">Address:</TextBlock>
          <TextBlock Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" Text="{Binding Path=Adress}"></TextBlock>
        </Grid>
      </Border>
    </DataTemplate>
  </Window.Resources>
  <StackPanel>
    <ListBox Name="myListBox" 
             ItemTemplate="{StaticResource ListboxTemplate}" Width="200"
             HorizontalContentAlignment="Stretch" 
             IsSynchronizedWithCurrentItem="True">
      <ListBox.GroupStyle>
        <GroupStyle>
          <GroupStyle.HeaderTemplate>
            <DataTemplate>
              <Label Content="{Binding Path=Name}" Foreground="White"
              Padding="4">
                <Label.Background>
                  <LinearGradientBrush>
                    <GradientStop Color="Blue" Offset="0" />
                    <GradientStop Color="Green" Offset=".25" />
                    <GradientStop Color="Yellow" Offset=".5" />
                    <GradientStop Color="Orange" Offset=".75" />
                    <GradientStop Color="Red" Offset="1" />
                  </LinearGradientBrush>
                </Label.Background>
              </Label>
            </DataTemplate>
          </GroupStyle.HeaderTemplate>
        </GroupStyle>
      </ListBox.GroupStyle>
    </ListBox>
    <Button Click="Button_Click">Add</Button>
    <Button Click="Button_Click_1">Fix</Button>
  </StackPanel>
</Window>
Вложения
Тип файла: rar Practice.rar (52.7 Кб, 55 просмотров)
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.10.2009, 20:15
Ответы с готовыми решениями:

Сортировка и группировка данных в Silverlight3
Кто-нибудь может объяснить почему представления не работают в Silverlight3? Например имеется некий класс SampleCollection который...

Отображение привязанных данных в виде checkBox
Доброго времени суток. У меня имеется примитивная модель: public class Student { public string FullName { get; set;...

Проблема с получением привязанных данных при передаче готового объекта
все привет.Помогите разобраться У меня есть главная форма. По кнопке вызывается форма 2 на которой пользователь вносит данные. ...

21
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
22.12.2009, 22:29  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от BitFields Посмотреть сообщение
TestClass также должен наследоваться от интерфейса IEditableObject,
тогда будет после изменения и редактирования произойдет сортировка и группировка.
Попробовал разобраться с этим интерфейсом и нигде не нашел хорошего законченного примера, что бы проверить сортировку и группировку.
Ты пробовал применять этот интерфейс к моему примеру? Можешь выложить рабочий код?
0
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
23.12.2009, 00:52
Цитата Сообщение от max_cn Посмотреть сообщение
Попробовал разобраться с этим интерфейсом и нигде не нашел хорошего законченного примера, что бы проверить сортировку и группировку.
Ты пробовал применять этот интерфейс к моему примеру? Можешь выложить рабочий код?
Есть статейка, показывающая применение интерфейсов IEditableObject и INotifyPropertyChanged, она для Silverlight, однако переделать под WPF не составит труда
How to: Group, Sort, and Filter Data in the DataGrid Control
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.12.2009, 00:52

Группировка данных
Добрый день. Новичок в WPF. Можно ли сгруппировать несколько grid. Что бы у меня была группа из гридов. Что бы я мог их скрыть одной...

Сортировка/группировка данных в сводной таблице
Помогите пожалуйста с сортировкой, группировкой данных в сводной таблице

Событие после изменения данных привязанных к DataGridView
С помощью DataGridView я отображаю записи, однако информация о них одновременно частично отображается и в другом месте (которую приходится...

Сортировка и группировка
Добрый день. Код привожу с сокращениями. Делаю запрос: SELECT operitems.ORD ord, job.DATE job_date, job.ID job_id FROM okb_db_operitems...

Сортировка и группировка
Есть гипотетическая задача: Несколько пользователей отвечают на тест из 9-ти вопросов. (Предположительно у каждого ответа есть свой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru