Последние сообщения

Страницы: 1 [2] 3
11
В большей мере о WPF / Data Binding. Start #2 Sort, Filter and grouping
« Последний ответ от Sergey Декабрь 27, 2012, 04:57:08 pm »
Интересно, а как сортировать по возрасту?

Изменим в классе StudentCollectionClass - поставщике коллекции, код добавления новых студентов в цикле. Это совсем не обязательный шаг - просто для того, чтобы было больше студентов с отличающимися возрастами.
Код: vb.net
  1.  For i As Integer = 0 To 5
  2.             NewFormedCollection.Add(New StudentClass() With
  3.                        {.StudentName = "Boris" & i.ToString,
  4.                          .Age = (18 + i).ToString})
  5. Next
  6.  
В обработчике события кнопки Sort добавим новое описание сортировки и закомментируем "старое":
Код: vb.net
  1. Private Sub BtnSort_Click(sender As Object, e As RoutedEventArgs) Handles BtnSort.Click
  2.         Dim CurrentViewOfStudents As ICollectionView = _
  3.            CollectionViewSource.GetDefaultView(ListBoxStudentsName.ItemsSource)
  4.         ' ========================
  5.         'CurrentViewOfStudents.SortDescriptions.Add(New SortDescription("StudentName", _
  6.         '                                               ListSortDirection.Ascending))
  7.         CurrentViewOfStudents.SortDescriptions.Add(New SortDescription("Age", _
  8.                                                        ListSortDirection.Ascending))
  9.         ' ========================
  10.     End Sub
  11.  
В коде разметки главного окна изменим отображаемое свойство элементов списка так:
Код: XML
  1. DisplayMemberPath="Age"
После нажатия кнопки сортировки получаем результат:
12
В большей мере о WPF / Data Binding. Start #2 Sort, Filter and grouping
« Последний ответ от Sergey Декабрь 27, 2012, 04:27:39 pm »
Продемонстрируем возможности сортировки в связанном списке на простом примере.

Будем работать с коллекцией студентов, отображаемых в ListBox с помощью Binding.
Заметим, связывание ListBox с коллекцией возможно двумя способами:
  • Назначением коллекции в коде через ItemsSource или DataContext (см. пример Data Binding. Start #1)
  • Назначением коллекции в качестве источника данных непосредственно в XAML. Интересно подметить, что в этом случае за кулисами (без нашего участия) создается экземпляр класса, поставляющий данные для ListBox. Мы лишь должны описать эту работу в XAML.
В рамках данного примера продемонстрируем второй способ.
Обычно создается класс, поставляющий данные. Лучше его расположить в отдельном проекте (рядом с другими классами, работающими на приложение и не имеющими прямого отношения к интерфейсу). Тип проекта может быть либо ClassLibrary, либо WPF User Control Library (в некоторых интересных случаях). Код класса студента очень прост. Кроме имени мы добавили сюда еще и возраст.
Код: vb.net
  1. Public Class StudentClass
  2.  
  3.     Public Property Age As Integer
  4.     Public Property StudentName As String = String.Empty
  5.  
  6.     Public Sub New(StudentName As String, _
  7.                    StudentAge As String)
  8.         Me.StudentName = StudentName
  9.         Me.Age = StudentAge
  10.     End Sub
  11.  
  12.     Public Sub New()
  13.  
  14.     End Sub
  15. End Class
  16.  
Теперь необходимо в главном проекте указать ссылку на библиотеку классов, в которой располагается наш класс студента. Далее, создадим класс, который будет поставлять студентов. Именно, коллекцию студентов. Использование в качестве коллекции ObservableCollection не случайно. Для особо пытливых скажем, что она (эта коллекция) имеет встроенное уведомление об изменении). Если не очень ясно - забудем об этих "глупостях". Код класса - поставщика студентов имеет вид:
Код: vb.net
  1. Imports System.Collections.ObjectModel
  2.  
  3. Public Class StudentCollectionClass
  4.  
  5.     Private _StudentsGroup As ObservableCollection(Of StudentClass)
  6.     Public Property StudentsGroup As ObservableCollection(Of StudentClass)
  7.         Get
  8.             Return _StudentsGroup
  9.         End Get
  10.         Set(value As ObservableCollection(Of StudentClass))
  11.             _StudentsGroup = value
  12.         End Set
  13.     End Property
  14.  
  15.     Public Sub GetStudentsGroup()
  16.  
  17.         Dim NewFormedCollection = New ObservableCollection(Of StudentClass)
  18.         NewFormedCollection.Add(New StudentClass() With {.StudentName = "Nicola", .Age = "39"})
  19.         NewFormedCollection.Add(New StudentClass() With {.StudentName = "Peter", .Age = "43"})
  20.         NewFormedCollection.Add(New StudentClass() With {.StudentName = "Sergey", .Age = "24"})
  21.         NewFormedCollection.Add(New StudentClass() With {.StudentName = "Jan", .Age = "34"})
  22.         NewFormedCollection.Add(New StudentClass() With {.StudentName = "Jeorge", .Age = "18"})
  23.  
  24.         For i As Integer = 0 To 5
  25.             NewFormedCollection.Add(New StudentClass() With {.StudentName = "Boris" & i.ToString,
  26.                                                              .Age = "18"})
  27.         Next
  28.  
  29.         Me.StudentsGroup = NewFormedCollection
  30.     End Sub
  31.  
  32.     Public Sub New()
  33.         Me.GetStudentsGroup()
  34.     End Sub
  35.  
  36. End Class
  37.  

Код разметки главного окна имеет вид:
Код: XML
  1. <Window x:Class="MainWindow"
  2.    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.    xmlns:classes="clr-namespace:ClassLibrary;assembly=ClassLibrary"
  5.    Title="MainWindow" Height="350" Width="525">
  6.     <Window.Resources>
  7.         <classes:StudentCollectionClass x:Key="StudentCollectionInstance"/>
  8.     </Window.Resources>
  9.     <Grid>
  10.         <ListBox Background="LightGreen"
  11.                 x:Name="ListBoxStudentsName"
  12.                 VerticalAlignment="Top"
  13.                 Width="100"
  14.                 ItemsSource="{Binding Source={StaticResource StudentCollectionInstance}, Path=StudentsGroup}"
  15.                 DisplayMemberPath="StudentName"
  16.                 MinWidth="200"/>
  17.     </Grid>
  18. </Window>
  19.  

Два слова об особенностях. В классе коллекции студентов просто обязан присутствовать пустой конструктор, - иначе XAML не поймет что и каким образом создавать. На практике, мы попросту не увидим ссылку в подсказках студии на возможный класс:
<classes:StudentCollectionClass x:Key="StudentCollectionInstance"/>. Это - общее правило использования статических ресурсов (внешних классов) в XAML.
Получаем следующее:


Приступим к простейшей сортировке. Чтобы видеть отчетливее результат наших действий, поместим кнопку в окне, по которой будем инициировать сортировку по именам студентов. Добавим к кнопке следующий обработчик события:
Код: vb.net
  1.  Private Sub BtnSort_Click(sender As Object, e As RoutedEventArgs) Handles BtnSort.Click
  2.         Dim CurrentViewOfStudents As ICollectionView = _
  3.            CollectionViewSource.GetDefaultView(ListBoxStudentsName.ItemsSource)
  4.         ' ========================
  5.         CurrentViewOfStudents.SortDescriptions.Add(New SortDescription("StudentName", _
  6.                                                        ListSortDirection.Ascending))
  7.         ' ========================
  8.     End Sub
  9.  
Потребуется также подключение библиотеки Imports System.ComponentModel
Теперь, по нажатию кнопки, наш список сортируется по именам студентов.
13
В большей мере о WPF / Data Binding. Start #1 Комментарий
« Последний ответ от Sergey Декабрь 24, 2012, 11:12:02 pm »
А как быть, если два списка и с разными стилями.
Желаемый результат таков:

Внесем в код конструктора следующие изменения:
Код: vb.net
  1.  Public Sub New()
  2.  
  3.         ' This call is required by the designer.
  4.         InitializeComponent()
  5.  
  6.         ' Add any initialization after the InitializeComponent() call.
  7.         Dim Programmers As New ProgrammersManagementClass()
  8.         Me.ListBoxProgrammers.DataContext = Programmers.PMC_ProgrammersCollection
  9.         ' Добавляем вторую команду программистов
  10.         Dim ProgrammersAdded As New ProgrammersManagementClass()
  11.         Me.ListBoxProgrammersAdded.DataContext = ProgrammersAdded.PMC_ProgrammersCollection
  12.     End Sub
  13.  
А код разметки перепишем, добавляя ключи к стилю
Код: XML
  1. <Window x:Class="MainWindow"
  2.    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.    Title="MainWindow" Height="350" Width="525">
  5.     <Window.Resources>
  6.         <Style x:Key="MyListBoxItemStyle" TargetType="ListBoxItem">
  7.             <Style.Triggers>
  8.                 <Trigger Property="ItemsControl.AlternationIndex" Value="0">
  9.                     <Setter Property="Background" Value="LightBlue"/>
  10.                 </Trigger>
  11.                 <Trigger Property="ItemsControl.AlternationIndex" Value="1">
  12.                     <Setter Property="Background" Value="Yellow"/>
  13.                 </Trigger>
  14.             </Style.Triggers>
  15.         </Style>
  16.         <Style x:Key="MyListBoxItemStyleAdded" TargetType="ListBoxItem">
  17.             <Style.Triggers>
  18.                 <Trigger Property="ItemsControl.AlternationIndex" Value="0">
  19.                     <Setter Property="Background" Value="Coral"/>
  20.                 </Trigger>
  21.                 <Trigger Property="ItemsControl.AlternationIndex" Value="1">
  22.                     <Setter Property="Background" Value="GreenYellow"/>
  23.                 </Trigger>
  24.             </Style.Triggers>
  25.         </Style>
  26.     </Window.Resources>
  27.     <Grid>
  28.         <DockPanel LastChildFill="False">
  29.             <ListBox x:Name="ListBoxProgrammers"
  30.                         ItemsSource="{Binding}"
  31.                         AlternationCount="2"
  32.                         DisplayMemberPath="PC_ProgrammersArea"
  33.                         ItemContainerStyle="{StaticResource ResourceKey=MyListBoxItemStyle}"  />
  34.             <ListBox x:Name="ListBoxProgrammersAdded"
  35.                 ItemsSource="{Binding}"
  36.                 AlternationCount="2"
  37.                 DisplayMemberPath="PC_ProgrammersArea"
  38.                 ItemContainerStyle="{StaticResource ResourceKey=MyListBoxItemStyleAdded}" />
  39.         </DockPanel>
  40.     </Grid>
  41. </Window>
  42.  
Интересно, но как, например, управлять шириной столбца или "отдельного item"... Пожалуй, без шаблонов не обойтись.
И еще замечание по профилю программистов. Для того, чтобы списки отличались необходимо изменить класс, поставляющий команды программистов:
Код: vb.net
  1. Imports System.Collections.ObjectModel
  2.  
  3. Public Class ProgrammersManagementClass
  4.     Public Property PMC_ProgrammersCollection As ObservableCollection(Of ProgrammerClass)
  5.     Private Shared RandomValue As New Random()
  6.  
  7.     Public Sub New()
  8.         Me.PMC_ProgrammersCollection = New ObservableCollection(Of ProgrammerClass)()
  9.         For i As Integer = 0 To 10
  10.             Dim NewFormedProgrammer As New ProgrammerClass("Name" & i.ToString, RandomValue.Next(7))
  11.             Me.PMC_ProgrammersCollection.Add(NewFormedProgrammer)
  12.         Next
  13.     End Sub
  14. End Class
  15.  
Продолжение следует...
14
В большей мере о WPF / Data Binding. Start #1 Комментарий
« Последний ответ от Sergey Декабрь 24, 2012, 10:46:51 pm »
Уж очень хочется сделать чередующиеся полосочки в ListBox. WPF - платформа очень богатая, поэтому должно существовать множество вариантов того, как это сделать. Итак, результат будет следующий:


Проще всего, пожалуй, это сделать так:
1. Добавим статический ресурс в код разметки сразу после описания окна.
Код: XML
  1. <Window.Resources>
  2.        <Style TargetType="ListBoxItem">
  3.             <Style.Triggers>
  4.                 <Trigger Property="ItemsControl.AlternationIndex" Value="0">
  5.                     <Setter Property="Background" Value="LightBlue"/>
  6.                 </Trigger>
  7.                 <Trigger Property="ItemsControl.AlternationIndex" Value="1">
  8.                     <Setter Property="Background" Value="Yellow"/>
  9.                 </Trigger>
  10.             </Style.Triggers>
  11.         </Style>
  12. </Window.Resources>
  13.  
Заметим, указание TargetType без указания ключа (или имени) стиля, то есть <Style TargetType="ListBoxItem"> вместо
<Style x:Key="MyListBoxItemStyle" TargetType="ListBoxItem"> приводит к тому, что все списки (существующие и вновь создаваемые в окне) будут отображаться с использованием описанного стиля "в полосочку". Полный код окна, с учетом указанного изменения остается прежним:
Код: XML
  1. <Window x:Class="MainWindow"
  2.    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.    Title="MainWindow" Height="350" Width="525">
  5.     <Window.Resources>
  6.         <Style TargetType="ListBoxItem">
  7.             <Style.Triggers>
  8.                 <Trigger Property="ItemsControl.AlternationIndex" Value="0">
  9.                     <Setter Property="Background" Value="LightBlue"/>
  10.                 </Trigger>
  11.                 <Trigger Property="ItemsControl.AlternationIndex" Value="1">
  12.                     <Setter Property="Background" Value="Yellow"/>
  13.                 </Trigger>
  14.             </Style.Triggers>
  15.         </Style>
  16.     </Window.Resources>
  17.     <Grid>
  18.         <ListBox x:Name="ListBoxProgrammers"
  19.                 ItemsSource="{Binding}"
  20.                 AlternationCount="2"
  21.                 DisplayMemberPath="PC_ProgrammersArea">
  22.         </ListBox>
  23.     </Grid>
  24. </Window>
  25.  
15
В большей мере о WPF / Data Binding. Start #1 Комментарий
« Последний ответ от Sergey Декабрь 24, 2012, 10:30:27 pm »
Заметим, что нет никакой необходимости использовать конструкцию вида:
Код: XML
  1. <ListBox.ItemTemplate>
  2.                 <DataTemplate>
  3.                     <TextBlock Text="{Binding Path=PC_ProgrammersArea}"/>
  4.                 </DataTemplate>
  5. </ListBox.ItemTemplate>
  6.  
Здесь используется очень мощный инструмент DataTemplate, позволяющий организовать представление данных для "каждого item". Но в нем нет необходимости, поскольку вывод строк не требует никаких дополнительных ухищрений - он организован сам по себе - автоматически, по умолчанию. Другими словами, если заменить вышеприведенную часть следующей
Код: XML
  1. <ListBox x:Name="ListBoxProgrammers"
  2.                 ItemsSource="{Binding}"
  3.                 AlternationCount="2"
  4.                 DisplayMemberPath="PC_ProgrammersArea">
  5. </ListBox>
  6.  
то мы получим тот же результат.
Другое дело - сложное (красочное, пользовательское) представление данных. В подобных случаях используют DataTemplate.
16
В большей мере о WPF / Data Binding. Start #1
« Последний ответ от Sergey Декабрь 24, 2012, 03:27:15 pm »
Что получим в итоге:


Выдающихся особенностей в WPF много. И одна из них, без сомнения, Data Binding - связывание данных. Применяться оно может повсюду, в самых разнообразных сценариях. Но, наверное, самая "активная" область применения этой технологии - работа с коллекциями. Иначе, это - область использования как ItemsControl -
Цитировать
Represents a control that can be used to present a collection of items,
так и сложных элементов управления, содержащих свойство ItemsSource или Items. Вот, к примеру, иерархия наследования ListBox и далее, ListView:
System.Object
   System.Windows.Threading.DispatcherObject
     System.Windows.DependencyObject
       System.Windows.Media.Visual
         System.Windows.UIElement
           System.Windows.FrameworkElement
             System.Windows.Controls.Control
               System.Windows.Controls.ItemsControl
                 System.Windows.Controls.Primitives.Selector
                   System.Windows.Controls.ListBox
                     System.Windows.Controls.ListView


Простой пример связывания данных.
Создадим приложение WPF. Разметка окна следующая:
Код: XML
  1. <Window x:Class="MainWindow"
  2.    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.    Title="MainWindow" Height="350" Width="525">
  5.     <Grid>
  6.         <ListBox x:Name="ListBoxProgrammers"
  7.                 ItemsSource="{Binding}">
  8.             <ListBox.ItemTemplate>
  9.                 <DataTemplate>
  10.                     <TextBlock Text="{Binding Path=PC_ProgrammersArea}"/>
  11.                 </DataTemplate>
  12.             </ListBox.ItemTemplate>
  13.         </ListBox>
  14.     </Grid>
  15. </Window>
  16.  

Код главного окна приложения:
Код: Visual Basic
  1. Imports ClassLibrary
  2.  
  3. Class MainWindow
  4.  
  5.     Public Sub New()
  6.  
  7.         ' This call is required by the designer.
  8.        InitializeComponent()
  9.  
  10.         ' Add any initialization after the InitializeComponent() call.
  11.        Dim Programmers As New ProgrammersManagementClass()
  12.         Me.ListBoxProgrammers.DataContext = Programmers.PMC_ProgrammersCollection
  13.     End Sub
  14. End Class
  15.  

Профиль (Enum - перечисление) программиста:
Код: vb.net
  1. Public Module Helper
  2.  
  3.     Public Enum Field
  4.         cpp
  5.         vbnet
  6.         csharp
  7.         php
  8.         maxima
  9.         mathematica
  10.         java
  11.         pascal
  12.     End Enum
  13.  
  14. End Module
  15.  

Код класса ProgrammerClass:
Код: vb.net
  1. Public Class ProgrammerClass
  2.     Public Property PC_ProgrammersName As String
  3.     Public Property PC_ProgrammersArea As Helper.Field
  4.  
  5.     Public Sub New(Name As String, _
  6.                    Area As Helper.Field)
  7.         Me.PC_ProgrammersName = Name
  8.         Me.PC_ProgrammersArea = Area
  9.     End Sub
  10. End Class
  11.  

И, наконец, код класса ProgrammersManagementClass, поставляющего коллекцию. Конечно, в реальности, в качестве поставщика коллекции выступает база данных, XML описание и др.
Код: vb.net
  1. Imports System.Collections.ObjectModel
  2.  
  3. Public Class ProgrammersManagementClass
  4.     Public Property PMC_ProgrammersCollection As ObservableCollection(Of ProgrammerClass)
  5.     Private RandomValue As Random
  6.  
  7.     Public Sub New()
  8.         Me.PMC_ProgrammersCollection = New ObservableCollection(Of ProgrammerClass)()
  9.         Me.RandomValue = New Random()
  10.         For i As Integer = 0 To 10
  11.             Dim NewFormedProgrammer As New ProgrammerClass("Name" & i.ToString, RandomValue.Next(7))
  12.             Me.PMC_ProgrammersCollection.Add(NewFormedProgrammer)
  13.         Next
  14.     End Sub
  15. End Class
  16.  
17
Timik Windows Phone / Первые скриншоты
« Последний ответ от SimplyNick Октябрь 27, 2012, 05:37:23 pm »
Первые скриншоты нового приложения


18
Timik Windows Phone / Скоро выйдет в свет
« Последний ответ от Main Moderator Октябрь 27, 2012, 04:50:27 pm »
В Orlovsoft практически закончились работы по созданию мобильного приложения для платформы Windows Phone.
Это - Timik  в мобильном воплощении. Те же балки, те же эпюры и те же значения в ключевых точках, однако в обновленном интерфейсе, адаптированном под мобильные платформы.
В ближайшее время продукт будет доступен на Windows Phone Marketplace через афилированного партнера в СНГ.
19
Что такое Тимик / Что включить в новую версию Тимик
« Последний ответ от Main Moderator Октябрь 19, 2012, 01:03:03 am »
Ряд приятных вопросов к нашим пользователям:
  • Каким функционалом расширить следующую версию Тимик?
  • Нужны ли Тимику собратья? Например, в кручении, растяжении-сжатии. Объединить ли все это в одном приложении или полезнее и проще для пользователей было бы иметь под рукой несколько приложений?
Предложения постить в этой ветке форума
20
Что такое Тимик / Изгиб балки онлайн. Обучающее видео по Timik
« Последний ответ от Sergey Октябрь 19, 2012, 12:43:49 am »
В нашей Медиа части появилось первое видео из серии Сопромат XXI. Оно посвящено численным расчетам балок на изгиб в
Тимик.
Важно. Указанная ссылка доступна зарегистрированным пользователям.

Ну а для тех, кто регистрироваться не желает, приглашаем к youtube просмотру
Изгиб балки онлайн. Сопромат XXI. helper.orlovsoft.com
Страницы: 1 [2] 3