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

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

30.10.2009, 20:15. Показов 11758. Ответов 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 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru