С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
5 / 5 / 4
Регистрация: 20.01.2011
Сообщений: 350
.NET 4.x

TreeView HierarchicalDataTemplate из простого списка

28.09.2015, 15:21. Показов 3514. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Что-то не могу найти решения на простой вопрос (на более сложные варианты есть примеры)
Есть у меня список List<DwgBaseItem> dwgBaseItems. Он простой - без вложенных коллекций. На основе класса:
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
[Serializable]
public class DwgBaseItem
{
    [XmlAttribute]
    public string Name { get; set; }// Название блока (узла)
    [XmlAttribute]
    public string MainGroup { get; set; }// Основная группа
    [XmlAttribute]
    public string Section { get; set; }// Раздел
    [XmlAttribute]
    public string SubSection { get; set; }// Подраздел
    [XmlAttribute]
    public string SourceFile { get; set; }// Файл-источник
    [XmlAttribute]
    public string Description { get; set; }// Описание
    [XmlAttribute]
    public bool isAnnotative { get; set; }// Аннотативный?
    [XmlAttribute]
    public bool HasAttributesForSpecification { get; set; }// Есть ли атрибуты для спецификации
    [XmlAttribute]
    public string ImageFile { get; set; }// Изображение для превью (путь к файлу) ОТНОСИТЕЛЬНЫЙ!!!
    [XmlAttribute]
    public bool IsBlock { get; set; }// Является ли блоком
    [XmlAttribute]
    public string BlockName { get; set; }// Имя блока в файле-исходнике
    // specification
    [XmlAttribute]
    public string DesignationAttributeName { get; set; }// Атрибут - Обозначение
    [XmlAttribute]
    public string NominationAttributeName { get; set; }// Атрибут - Наименование
    [XmlAttribute]
    public string MassAttributeName { get; set; }// Атрибут - масса
    [XmlAttribute]
    public string NoteAttributeName { get; set; }// Атрибут - примечание
    //--------------
 
}
Дело в том, что мне нужно забиндить его к TreeView и сделать отображение иерархическим на основе значений MainGroup, Section и SubSection (картинку прилагаю)
Подскажите как это сделать или какую-нибудь ссылку с примером
Изображения
 
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.09.2015, 15:21
Ответы с готовыми решениями:

Command в HierarchicalDataTemplate у TreeView
Есть TreeView, у которого элементы верхнего уровня представлены классом TEGModel, а элементы нижнего уровня - ItemModel. Вот такая...

Построение TreeView на основе БД с помощью HierarchicalDataTemplate
Помогите с построением иерархического TreeView. PARENTID - родитель. в XAML &lt;TreeView ItemsSource=&quot;{Binding...

Изменение содержимого простого списка при апдейте выпадающего списка
Добрый день! Суть моей просьбы о помощи такова: На форме (пока) расположен выпадающий список с определенными значениями и ниже...

22
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
28.09.2015, 16:19
держи
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
28.09.2015, 16:31
Modis, нужен просто адаптер который будет правильно восстанавливать ваши данные в визуально представление... Если точнее, то что Вы показали это объект данных (Модель) а Вам нужно создать представление этих данных (ВьюМодель) следовательно у вас должен быть сервис который отвечает за загрузку данных и соответственно у него должна быть информация как восстановить данные в Вашу объектную модель...Далее имея построенную объектную модель Вы сможете без труда привязать данные к тривью...

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

Добавлено через 5 минут
Кажись не совсем, то написал =) не увидел,что у вашего объекта нет вложенности других объектов (как у папок) - тобишь Вам просто надо сделать нормально шаблон итема.
0
5 / 5 / 4
Регистрация: 20.01.2011
Сообщений: 350
28.09.2015, 16:37  [ТС]
Цитата Сообщение от amarf Посмотреть сообщение
Кажись не совсем, то написал =) не увидел,что у вашего объекта нет вложенности других объектов (как у папок) - тобишь Вам просто надо сделать нормально шаблон итема.
Вот на этом я и застрял)) Вроде должно быть просто, а я не знаю как!
Сложный вариант (с вложенностью) по примеру из интернета я реализовал уже. А вот на простом застрял(
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
28.09.2015, 16:45
Modis, У Вас к коде простой класс без коллекций, а на картинке, явно, показана коллекция итемов имеющая более одного подъэдемента, и тут возникает полное недопонимание, что Вы хотите получить в итоге...какое свойство где должно отображаться.
0
5 / 5 / 4
Регистрация: 20.01.2011
Сообщений: 350
28.09.2015, 16:55  [ТС]
Цитата Сообщение от amarf Посмотреть сообщение
Modis, У Вас к коде простой класс без коллекций, а на картинке, явно, показана коллекция итемов имеющая более одного подъэдемента, и тут возникает полное недопонимание, что Вы хотите получить в итоге...какое свойство где должно отображаться
Смысл такой: Я создаю коллекцию из элементов этого самого простого класса. В TreeView мне нужно отобразить всю эту коллекцию, просто сгруппировав. Т.е. в коллекции будет много элементов, у которых будут совпадать MainGroup, Section, Subsection, а в TreeView мне просто нужно это отобразить...
Блин, я плохо умею объяснять
Попробую по другому:
1. Создаю ListBox в котором отображаю только группы (через LINQ это можно)
2. При выборе группы в этом ListBox, я заполняю следующий ListBox, только уже значениями, у которых такое-же значение Group. Отображаю только Section
3. Тоже самое, что и в п.2, только теперь в 3 ListBox я добавляю те, у которых совпало SubSection
4. Ну и последний шаг - в 4 ListBox отображаю все значения (отображаю Name) у которых совпало SubSection
А в моем вопросе я хочу избежать первые 3 пункта и все отобразить в TreeView
0
5 / 5 / 4
Регистрация: 20.01.2011
Сообщений: 350
28.09.2015, 17:02  [ТС]
Вот так думаю более понятно будет:
Вот xml-файл который десериализуется в коллекцию (два значения):
XML
1
2
3
4
5
<?xml version="1.0"?>
<ArrayOfDwgBaseItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <DwgBaseItem Name="1.1" MainGroup="Блоки" Group="Автомобильные дороги" Section="Дорожные знаки" SubSection="Предупреждающие знаки" SourceFile="Дорожные знаки/RS_2D-3D-MV-DB_ru.DWG" Description="1.1 Железнодорожный переезд со шлагбаумом" Document="ГОСТ Р 52290-2004" isAnnotative="true" HasAttributesForSpecification="false" ImageFile="" IsBlock="true" BlockName="RS-DB-1.1" />
  <DwgBaseItem Name="1.2" MainGroup="Блоки" Group="Автомобильные дороги" Section="Дорожные знаки" SubSection="Предупреждающие знаки" SourceFile="Дорожные знаки/RS_2D-3D-MV-DB_ru.DWG" Description="1.2 Железнодорожный переезд без шлагбаума" Document="ГОСТ Р 52290-2004" isAnnotative="true" HasAttributesForSpecification="false" ImageFile="" IsBlock="true" BlockName="RS-DB-1.2" />  
</ArrayOfDwgBaseItem>
А во вложении то, как он должен отобразится

P.S. Я правда добавил еще параметр Group, но суть вопроса не меняется
Миниатюры
TreeView HierarchicalDataTemplate из простого списка  
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
28.09.2015, 17:08
Modis, Значит надо создать класс представления (класс на подобии обычной папки) у которого будет два свойства - это имя и коллекция итемов и адаптер который будет создавать дерево из этих итемов и папок - решение не совсем тривиальное но именно так я и делал, даже создал универсальный объект в который можно поместить, что угодно и сохранить в xml в виде двух списков, в одном папки в другом файлы...
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
28.09.2015, 17:17
Так скину свой маленький проект - он очень сырой и я его не доделал, но кое что в нем работает +)))

Glebov.Folder.zip

Как пользоваться:

Заполнение, загрузка, сохранение:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            Folder MainFolder = new Folder() { Name = "Desings Main Folder" };
 
            var Folder_1_1 = new Folder() { Name = "ПСД (проекты)" };
            var Folder_1_2 = new Folder() { Name = "ПСД (проекты)" };
            var Folder_1_3 = new Folder() { Name = "ПСД (проекты)" };
 
            Folder_1_1.Add(new MyObject1());
            Folder_1_1.Add(new MyObject2());
            Folder_1_1.Add(new MyObject3());
 
 
            Folder_1_2.Add(new MyObject3());
            Folder_1_2.Add(new MyObject3());
            Folder_1_2.Add(new MyObject3());
 
            MainFolder.Add(Folder_1_1);
            MainFolder.Add(Folder_1_2);
            MainFolder.Add(Folder_1_3);
 
 
            MainFolder.SaveFoderDataToXml(@"C:\xml.xml");
            MainFolder.LoadFoderDataFromXml(@"C:\xml.xml", new List<Type>() {typeof(MyObject1), typeof(MyObject2), typeof(MyObject3), });

Шаблон:

XML
1
2
3
4
5
6
7
8
9
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:entity="clr-namespace:Acw.Entity;assembly=Acw.Entity"
                    xmlns:vm="clr-namespace:Acw.ViewModel.ViewModel"
                    xmlns:FolderType="clr-namespace:Glebov.FolderType;assembly=Glebov.FolderType">
    <HierarchicalDataTemplate DataType="{x:Type FolderType:Folder}" ItemsSource="{Binding Folders}">
        <TextBlock Text="{Binding Name}"/>
    </HierarchicalDataTemplate>
</ResourceDictionary>
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
28.09.2015, 17:32
Ах да у итемов нужно реализовать интерфейс IHaveParentFolder и сего свойства сделать обычными автоматическими, тогда будет автоматом происходить восстановление их из xml по папочкам..


Что бы видеть все что запихано в папку можно использовать ItemsSource="{Binding .}"
0
5 / 5 / 4
Регистрация: 20.01.2011
Сообщений: 350
29.09.2015, 09:30  [ТС]
amarf, пример конечно хороший, но я ничего не понял)) Сложновато для меня

Сегодня проснулся и понял - нужно один момент делать по-другому! Нужно, чтобы источником для TreeView были не параметры класса, а один параметр со строкой. А строка, разделяемая, например слешем (/), и была основой для построения.
Ну типа есть пару строк:
аа/бб/вв/гг
аа/бб/вв/гг
аа/бб/вв/дд
после обработки в TreeView должно быть так:
C#
1
2
3
4
5
аа
--бб
   --вв
      --гг
      --дд
Причем количество вложений может быть разным и выбор последнего должен запускать обработчик событий выбора
0
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
29.09.2015, 10:23
по-моему самый простой вариант был бы расширить ваш класс на 1 параметр, скажем
C#
1
private string parent;
и создать уже нужное дерево в коде, а потом просто исходя из этого дерева строить treeview. а для того, как будет выглядеть узел описать шаблон.

к примеру:

MainGroup1 (parent: root)
Section1 (parent: MainGroup1)
Section2(parent: MainGroup2)
Subsection1(parent: Section2)
и т.п.

сами узлы TreeViewItem можно назвать для удобства также, чтобы было проще добавлять узлы в дерево.
ну как-то так..
0
5 / 5 / 4
Регистрация: 20.01.2011
Сообщений: 350
29.09.2015, 10:31  [ТС]
Я нашел хороший пример того, что мне нужно. НО! Но там только часть кода, а ввиду моих небольших знаний в этой области я не понимаю что такое TreeModel и TreeViewModel (см.ссылку)
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
29.09.2015, 12:08
Modis, Вам не кажется, что пора начать изучать, а не продолжать искать. Чтобы Вам объяснить что такое Model, ViewModel и View да и вообще патерн MVVM понадобится много времени и сил.
0
5 / 5 / 4
Регистрация: 20.01.2011
Сообщений: 350
29.09.2015, 12:12  [ТС]
Цитата Сообщение от amarf Посмотреть сообщение
Modis, Вам не кажется, что пора начать изучать, а не продолжать искать. Чтобы Вам объяснить что такое Model, ViewModel и View да и вообще патерн MVVM понадобится много времени и сил.
Я не спорю. Но и изучать - пока найдешь что нужно - крыша поедет. И придется потратить оооочень много времени на изучение информации, которая мне нужна один раз и не играет сильной роли.
Да и вообще - странно, что чтобы отобразить обычный список в TreeView нужно столько усилий!
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
29.09.2015, 12:20
Modis, Если на один раз то зачем вообще програмировать.. Если вы считаете, что обучение нужно только для получения знания о чем-то конкретном то вы очень много не понимаете... Если вы хотите не париться то организует у себя в коде нормальный мастер детэйл сценарий и работайте с ним...

В любом из случаев вам придётся потратить усилия на изучение.... Для меня вот это - пару пустяков, но для вас это целый подвиг и все лишь потому что я когда-то потратил свое время, без этого ни как...
0
5 / 5 / 4
Регистрация: 20.01.2011
Сообщений: 350
29.09.2015, 12:30  [ТС]
amarf, может тогда подскажите и что почитать? В интернете слишком много информации. И найти среди нее ту, что является "основой" очень сложно.
Про MSDN молчу - у них вообще все непонятным языком написано. Как-будто для программистов с 10-ним стажем

Добавлено через 5 минут
И кстати - как это сделать в коде - я более менее представляю. Т.е. "вручную" строить дерево, обрабатывая событие Expanded. Я просто полагал, что через Binding это должно быть проще и элегантнее
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
29.09.2015, 12:51
Цитата Сообщение от Modis Посмотреть сообщение
может тогда подскажите и что почитать
Ну начните с C# для новичков - судя по всему Вы даже основ языка не знаете...
Можете конечно почитать Макдональда про Wpf там есть раздел посвященный TreeView, но боюсь без знания языка долго будете разбираться...

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

Цитата Сообщение от Modis Посмотреть сообщение
Про MSDN молчу - у них вообще все непонятным языком написано. Как-будто для программистов с 10-ним стажем
Смешно +))) MSDN написан для программистов и если Вы сейчас только пытаетесь программировать, то прочтите хоть одну книгу про C# и MSDN для Вас будет просто большой справкой с очень понятным языком +))))

Ща что нить накидаю под Вашу задачу, если на работе дадут...
0
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
29.09.2015, 16:17
WpfApplication111.zip
0
5 / 5 / 4
Регистрация: 20.01.2011
Сообщений: 350
30.09.2015, 10:45  [ТС]
amarf, благодаря вашему примеру и ссылке, что я давал выше, получил то, что мне нужно - получение дерева из строк:
XAML:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<Window x:Class="ForForum.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ForForum"
        mc:Ignorable="d" Loaded="Window_Loaded"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView Name="Tvitems">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Items}">
                    <TextBlock Text="{Binding Name}"></TextBlock>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
</Window>
Code behind:
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
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;
 
namespace ForForum
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        public void Window_Loaded(object sender, RoutedEventArgs e)
        {
            List<string> mdl = new List<string>
            {
                 "aa/bb/cc/dd",
                 "aa/bb/cc1/dd1",
                 "aa/bb/cc1/dd1" ,
                 "aa/bb/cc",
                 "aa/bb/cc" ,
            };
            List<MyViewModel> vm1 = BuildTree(mdl);
            Tvitems.ItemsSource = vm1;
        }
        private List<MyViewModel> BuildTree(IEnumerable<string> strings)
        {
            return (
              from s in strings
              let split = s.Split('/')
              group s by s.Split('/')[0] into g
              select new MyViewModel
              {
                  Name = g.Key,
                  Items = BuildTree(
                    from s in g
                    where s.Length > g.Key.Length + 1
                    select s.Substring(g.Key.Length + 1))
              }
              ).ToList();
        }
    }
    
    class MyData
    {
        public string DataString { get; set; }
    }
    class MyViewModel : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged
 
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
 
        #endregion
 
        public MyViewModel()
        {
            Items = new List<MyViewModel>();
        }
 
        /// <summary>
        /// Это итемы объекта
        /// </summary>
        public List<MyViewModel> Items { get; set; }
 
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set { if (_Name != value) { _Name = value; OnPropertyChanged("Name"); } }
        }
        
    }
}
Осталось только решить одну проблему - прикрутить обработчик события выбора ПОСЛЕДНЕГО элемента в дереве, для заполнения ListBox. Хотя, наверно, событие выбора любого элемента будет круче - можно более разнообразить хранение данных
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2015, 10:45
Помогаю со студенческими работами здесь

Сформировать из простого списка ассоциативный
Сформировать из простого списка ассоциативный, поставив ключи в виде последовательных чисел вот что попытался написать я: (setq f (list...

Удалить атом х из простого списка
удалить атом х из простого списка

Сортировка списка методом простого обмена
Помогите пожалуйста. Никак не могу разобраться с динамическими вещами. Используя представление последовательности чисел в виде...

Сортировка линейного списка. Алгоритма простого обмена
Используя представление последовательности чисел в виде линейного списка , напишите программу , сортировки этой последовательности при...

Представить коэффициенты многочлена в виде простого однонаправленных списка
Представить коэффициенты многочлена {a}_{n}{x}^{n}+...+{a}_{1}x+{a}_{0} в виде простого однонаправленных списка и написать процедуру для...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru