С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Заблокирован
1

WPF Generics in XAML

12.09.2024, 15:16. Показов 508. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как создать экземпляр универсального списка List<T> в XAML?
Пробовал и сам List<T> и унаследованный от него MyList<T> - ошибка одинаковая - данного типа нет в соответствующем пространстве имён (scg или local - соответственно)
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
<Window x:Class="metanit_Wpf_xmlsn_TypeGeneric.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:metanit_Wpf_xmlsn_TypeGeneric"         
        xmlns:sys="clr-namespace:System;assembly=mscorlib" 
        xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"            
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
   
    <Window.Resources >       
        <scg:List x:TypeArguments="sys:String" x:Key="days">
            <sys:String>Понедельник</sys:String>
            <sys:String>Вторник</sys:String>
            <sys:String>Среда</sys:String>
            <sys:String>Четверг</sys:String>
            <sys:String>Пятница</sys:String>
            <sys:String>Суббота</sys:String>
            <sys:String>Воскресенье</sys:String>
        </scg:List>
        <local:MyList x:TypeArguments="sys:String" x:Key="days2">
            <sys:String>Понедельник</sys:String>
            <sys:String>Вторник</sys:String>
            <sys:String>Среда</sys:String>
            <sys:String>Четверг</sys:String>
            <sys:String>Пятница</sys:String>
            <sys:String>Суббота</sys:String>
            <sys:String>Воскресенье</sys:String>
        </local:MyList>
    </Window.Resources>
    <Grid>
    </Grid>
</Window>

C#
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace metanit_Wpf_xmlsn_TypeGeneric
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }       
    }
    public class MyList<T> : List<T>;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.09.2024, 15:16
Ответы с готовыми решениями:

DataContent на XAML (Wpf)
Не знаю возможно ли такое. Если да - подскажите как. Примеры упрощённые для обучения. Есть...

WPF: порядок атрибутов в XAML
Есть 'DataGrid', у его строк есть контекстное меню: &lt;ContextMenu x:Key=&quot;ItemsRowMenu&quot;&gt; ...

Дизайн и верстка xaml wpf
Здравствуйте, где можно брать материал по красивой верстке wpf приложений?

Видеоплеер WPF, XAML и MediaElement
Всем доброго времени суток) Не судите строго, новичок в этой теме. Реализую видеоплеер на основе...

15
255 / 131 / 46
Регистрация: 19.08.2021
Сообщений: 342
12.09.2024, 19:09 2
Начиная с .net core и далее, теперь так:
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
<Window x:Class="ListInXaml.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        mc:Ignorable="d" 
        xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <col:ArrayList  x:Key="list">
            <sys:String>Понедельник</sys:String>
            <sys:String>Вторник</sys:String>
            <sys:String>Среда</sys:String>
            <sys:String>Четверг</sys:String>
            <sys:String>Пятница</sys:String>
            <sys:String>Суббота</sys:String>
            <sys:String>Воскресенье</sys:String>
        </col:ArrayList>
    </Window.Resources>
    <Grid>
        <ListBox ItemsSource ="{StaticResource list}"/>
    </Grid>
</Window>
0
Заблокирован
12.09.2024, 19:18  [ТС] 3
divzl, но это не универсальная коллекция. И потом, давно уже вместо типа ArrayList (устарел) рекомендуется иcпользовать универсальный List<object>.
Не рекомендуется использовать класс для разработки ArrayList новых приложений. Вместо этого рекомендуется использовать универсальный List<T> класс . Класс ArrayList предназначен для хранения разнородных коллекций объектов . Однако он не всегда обеспечивает лучшую производительность. Вместо этого рекомендуется следующее:

Для разнородной коллекции объектов используйте List<Object> тип....
Для однородной коллекции объектов используйте List<T> класс .
0
255 / 131 / 46
Регистрация: 19.08.2021
Сообщений: 342
12.09.2024, 20:25 4
Типизированный ) вариант для WPF:
XML
1
2
3
4
 <x:Array Type="{x:Type sys:String}" x:Key="list1">
     <sys:String>Понедельник</sys:String>
     <sys:String>Вторник</sys:String>
 </x:Array>
Но, предыдущий, мне больше нравиться.
Цитата Сообщение от titan4ik Посмотреть сообщение
но это не универсальная коллекция
В приведенном вами описании предпочтения универсальных коллекций, ключевая причина - "лучшая производительность". Но вы же создаёте экземпляр в XAML, который вообще не про производительность. Как правила коллекции созданные в XAML не подвергают ресурсоёмким операциям: сортировкам, поискам и т.д., а используют в каком ни будь ListBox, как я указал выше в качестве примера. Но если всё же необходимы ресурсоёмкие операции, то можно привести коллекцию в коде c# к List. Такое приведение займет ничтожно малое время по сравнению с интерпретацией коллекции из XAML. Но это скорее крайняя позиции. Суть в том, что производительность, в данном контексте не причина, что бы не использовать ArrayList.
0
Заблокирован
12.09.2024, 20:46  [ТС] 5
divzl, мой вопрос был чисто теоретический. Я увидел пример того как вроде бы реализован List<T> в XAML, но он у меня не заработал и я хочу понять причины этого и как правильно можно это сделать.
Примеры использования
В этих примерах предполагается, что объявляются следующие определения пространства имен XAML:
XAML
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"

List<String>
<scg:List x:TypeArguments="sys:String" ...> создает экземпляр нового List<T> с аргументом String типа.
https://learn.microsoft.com/ru... -directive

Добавлено через 1 минуту
Правда, это XAML 2009
Но думал, что и для WPF возможно что-то подобное.

Добавлено через 1 минуту
Если это не так, то странновато как-то.
А практически мне это не нужно. Но хочется поставить точку в этом - можно или нет в WPF определить экземпляр List<T> в XAML.
0
255 / 131 / 46
Регистрация: 19.08.2021
Сообщений: 342
12.09.2024, 21:08 6
Цитата Сообщение от titan4ik Посмотреть сообщение
Я увидел пример того как вроде бы реализован List<T> в XAML, но он у меня не заработал и я хочу понять причины этого
Попробуйте использовать .NET Framework 4.x в нём тот пример должен работать.
1
Заблокирован
12.09.2024, 21:11  [ТС] 7
divzl, спасибо, но зачем в 2024 году .NET Framework 4.x? Надо на .NET 8,0
0
255 / 131 / 46
Регистрация: 19.08.2021
Сообщений: 342
15.09.2024, 11:22 8
Ваш исходный вариант с MyList, можно доработать следующим образом:
C#
1
2
3
public class MyList : List<String> { };
//или
public class MyList : List<Object> { };
XML
1
<local:MyList  x:Key="days2">
0
Заблокирован
15.09.2024, 11:40  [ТС] 9
Цитата Сообщение от divzl Посмотреть сообщение
исходный вариант с MyList, можно доработать следующим образом:
C#
Исходный был List<T>, MyList<T> - это уже попытка адаптации. MyList<string> - это уже второе отступление с исходных позиций. Но у меня и с MyList<string> те же ошибки.
А у Вас работает? Вы проверяли?
У меня две ошибки:
1) Атрибут x:TypeArguments может быть указан только в корневом теге
2) Имя MyList не существует в пространстве имен проекта
0
255 / 131 / 46
Регистрация: 19.08.2021
Сообщений: 342
15.09.2024, 12:18 10
Цитата Сообщение от titan4ik Посмотреть сообщение
А у Вас работает? Вы проверяли?
Да. Да.
Цитата Сообщение от titan4ik Посмотреть сообщение
1) Атрибут x:TypeArguments может быть указан только в корневом теге
В моём предыдущем сообщении x:TypeArguments убран. Без него работает.
Цитата Сообщение от titan4ik Посмотреть сообщение
2) Имя MyList не существует в пространстве имен проекта
MyList<string>, так работать не будет. Только так: public class MyList : List<String> { };
1
Заблокирован
15.09.2024, 12:37  [ТС] 11
Цитата Сообщение от divzl Посмотреть сообщение
public class MyList : List<String> { };
Там скобочки не нужны, наверное.
Работает и с ними и без.
Да. Работает так. Но это уже не универсальная коллекция, определенная в XAML. Она определена в коде.
divzl, спасибо за участие.
Честно говоря, не думал, что такой вроде бы простой вопрос окажется неразрешимым. Практически это не очень важно. Универсальный список всегда можно определить в коде. Однако...

Добавлено через 5 минут
Цитата Сообщение от titan4ik Посмотреть сообщение
Но у меня и с MyList<string> те же ошибки.
Пардон, там я накосячил в коде. Это же вообще синтаксически неправильная конструкция.
0
2337 / 1825 / 753
Регистрация: 27.07.2012
Сообщений: 5,401
15.09.2024, 13:18 12
Цитата Сообщение от titan4ik Посмотреть сообщение
Честно говоря, не думал, что такой вроде бы простой вопрос окажется неразрешимым.
Wow! Wow! Поменьше драматизма!

На самом деле это не неразрешимый вопрос, просто его "решение" несколько противоречит самой сути XAML и обобщённых классов в C#. Разметка XAML генерируется в код и определяется на этапе компиляции, тогда же как обобщённые классы - на этапе выполнения. И потому создать механизм, который бы позволил в однозначной и непротиворечивой форме использовать обобщённые типы в коде разметки, видимо, не так просто. Тем более, когда есть простые решения типа using MyStringList = List<string>; и подобных.

Возможно, я слишком упрощённо всё описал, но суть примерно такая.
1
Заблокирован
15.09.2024, 13:23  [ТС] 13
Ну и слава богу)
Я-то думал, что это у меня дурня не получается.
0
Модератор
Эксперт .NET
15857 / 11004 / 2855
Регистрация: 21.04.2018
Сообщений: 32,341
Записей в блоге: 2
15.09.2024, 14:28 14
Цитата Сообщение от John Prick Посмотреть сообщение
Разметка XAML генерируется в код и определяется на этапе компиляции,
В какой код?

Цитата Сообщение от John Prick Посмотреть сообщение
тогда же как обобщённые классы - на этапе выполнения.
Запуска приложения?
Их несколько. На каком именно?
Если рантайм, то это не так.

Цитата Сообщение от John Prick Посмотреть сообщение
И потому создать механизм, который бы позволил в однозначной и непротиворечивой форме использовать обобщённые типы в коде разметки, видимо, не так просто.
Ну, ... В целом - не так.
Сейчас попробую собрать пример.

Добавлено через 44 минуты
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
    [ContentProperty("Items")]
    [MarkupExtensionReturnType(typeof(IList))]
    public class ListExtension : MarkupExtension
    {
        private Type elementType = typeof(object);
 
        private IList list = new List<object>();
 
        [ConstructorArgument("elementType")]
        public Type ElementType
        {
            get => elementType;
            set
            {
                elementType = value ?? typeof(object);
 
                Type lt = typeof(List<>).MakeGenericType(elementType);
 
                var constructor = lt.GetConstructor(Array.Empty<Type>());
                IList _list = (IList)constructor!.Invoke(Array.Empty<object>());
                foreach (var item in list)
                {
                    _list.Add(item);
                }
                list = _list;
            }
        }
 
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return list;
        }
 
        public ListExtension()
        {
        }
 
        public ListExtension(Type? elementType)
        {
            ElementType = elementType ?? typeof(object);
        }
 
 
        /// <summary>
        /// Called to Add an object as a new array item. This will append the
        /// object to the end of the array.
        /// </summary>
        /// <param name="value">Object to add to the end of the array.</param>
        public void AddChild(object value) => list.Add(value);
 
        /// <summary>
        /// Called to Add a text as a new array item. This will append the
        /// object to the end of the array.
        /// </summary>
        /// <param name="text">Text to Add to the end of the array.</param>
        public void AddText(string text) => AddChild(text);
 
        /// <summary>
        /// An IList accessor to the contents of the array
        /// </summary>
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public IList Items => list;
    }
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<Window x:Class="Core2024.MainWindow"
        -------------------------------
        DataContext="{DynamicResource vm}">
    <Window.Resources>
        <local:TestViewModel x:Key="vm"/>
        <local:List ElementType="sys:Int32" x:Key="list">
            <sys:Int32>1</sys:Int32>
            <sys:Int32>2</sys:Int32>
            <sys:Int32>3</sys:Int32>
            <sys:Int32>4</sys:Int32>
        </local:List>
    </Window.Resources>
    
    ----------------------------
    
            <ListBox ItemsSource="{Binding Mode=OneWay, Source={StaticResource list}}"/>
    
    ----------------------------
</Window>
Добавлено через 7 минут
Насколько я в курсе этой проблемы атрибут x:TypeArguments определён для XAML 2009.
А в WPF XAML компилируется в BAML, который не поддерживает XAML 2009.
Если загружать XAML без промежуточной компиляции в BAML, например, методом XamlReader.Load, то x:TypeArguments должен нормально обрабатываться.
1
2337 / 1825 / 753
Регистрация: 27.07.2012
Сообщений: 5,401
15.09.2024, 14:35 15
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В какой код?
В тот, который потом будет скомпилирован в исполняемый. )

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Запуска приложения?
Их несколько. На каком именно?
Если рантайм, то это не так.
Я имел ввиду конкретизацию обощенного типа типом-заполнителем. Это на этапе выполнения происходит. Когда конкретно сейчас сходу не вспомню, это уже надо уточнять.
0
Модератор
Эксперт .NET
15857 / 11004 / 2855
Регистрация: 21.04.2018
Сообщений: 32,341
Записей в блоге: 2
15.09.2024, 15:13 16
Цитата Сообщение от John Prick Посмотреть сообщение
В тот, который потом будет скомпилирован в исполняемый. )
.Net языки (в том числе Шарп) компилируются в сборки на CIL. CIL поддерживает джененрики. Запускает такую сборку CLR - это .Net аналог Java Virtual Machine. CLR производит ещё одну компиляция CIL в нативный код. Этот код загружается в память и запускается уже на исполнение процессором - это уже период рантайма. Вот в нативном коде уже нет джененриков.
А XAML вовсе компилируется в BAML. Который загружается и интерпретируется уже в рантайм.

Добавлено через 14 минут
Поддержка XAML 2009 в WPF и Visual Studio
В WPF можно использовать возможности XAML 2009, но только для кода XAML, не скомпилированного с разметкой WPF. Скомпилированный XAML с разметкой и форма BAML кода XAML пока не поддерживают ключевые слова языка и компоненты XAML 2009.
0
15.09.2024, 15:13
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.09.2024, 15:13
Помогаю со студенческими работами здесь

WPF TabControl через XAML
Доброго всем времени суток. Люди, подскажите, желательно, как через XAML в WPF сделать вкладки у...

Сериализация xaml wpf пример
Подскажите пожалуйста как сохранить ListBox который создан в XAML а потом из него запустить...

WPF XAML trigger на datagridtextcolumn
Возможно ли сделать триггер на datagridtextcolumn, то есть если условие тригера проходит то...

Форма регистрации wpf(xaml)
Доброго времени суток всем участникам форума. Кто-нибудь может помочь сделать такую же форму...

WPF XAML Проблема с дублированием столбцов
Здравствуйте, возникла вот какая проблема. У меня есть список List состоящий из класса stroka(код...

XAML разметка элемента DataGrid | WPF
Пишу xaml-код и при верстке (иль как правильно - не знаю) приложения возникла фигня одна. В...

Плавное появление формы WPF XAML
Перешел с Windows Forms на WPF сразу столкнулся с проблемой. Плавное появление формы в WPF. В вин...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru