Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273

Не отображаются элементы в ItemsControl

05.06.2025, 18:54. Показов 3200. Ответов 31

Студворк — интернет-сервис помощи студентам
Здравствуйте.
хочу сделать окно для заполнения пользователем атрибутов объекта, по типу диалогового окна.
Так как атрибутов много решил сделать через ItemsControl. И половина интерфейса отображается, а половина нет.

есть такой класс для вью:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class AttributeRowObject : INotifyPropertyChanged
{
    public string Name { get; set; }
    public AttributeType AttributeType { get; set; }
    public string PropertyName { get; set; }
    public bool IsReadOnly { get; set; }
    public bool IsRequired { get; set; }
 
    private object _value;
    public object Value
    {
        get => _value;
        set { _value = value; OnPropertyChanged(); }
    }
 
    public event PropertyChangedEventHandler PropertyChanged;
 
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
Сделал вот такой селектор выбора шаблона:
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
public class AttributeTypeTemplateSelector : DataTemplateSelector
{
    public DataTemplate TextTemplate { get; set; }
    public DataTemplate NumberTemplate { get; set; }
    public DataTemplate DateTemplate { get; set; }
    public DataTemplate FileTemplate { get; set; }
 
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is AttributeRowObject row)
        {
            switch (row.AttributeType)
            {
                case AttributeType.Text:
                    return TextTemplate;
 
                case AttributeType.Number:
                    return NumberTemplate;
 
                case AttributeType.Date:
                    return DateTemplate;
 
                case AttributeType.File:
                    return FileTemplate;
            }
        }
        return base.SelectTemplate(item, container);
    }
}
такой код 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
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
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Resources/StylesResourceDictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
 
        <conv:ZeroToEmptyStringConverter x:Key="ZeroToEmptyStringConverter"/>
 
        <Style x:Key="RequiredTextBoxStyle" TargetType="TextBox">
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="FontSize" Value="14"/>
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding IsRequired}" Value="True"/>
                        <Condition Binding="{Binding Value}" Value=""/>
                    </MultiDataTrigger.Conditions>
 
                    <Setter Property="BorderBrush" Value="Red"/>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
 
        <DataTemplate x:Key="TextAttributeTemplate">
            <TextBox Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                     Style="{StaticResource RequiredTextBoxStyle}"/>
        </DataTemplate>
 
        <DataTemplate x:Key="NumberAttributeTemplate">
            <TextBox Text="{Binding Value, Mode=TwoWay, Converter={StaticResource ZeroToEmptyStringConverter}, UpdateSourceTrigger=PropertyChanged}"
                     Style="{StaticResource RequiredTextBoxStyle}"/>
        </DataTemplate>
 
        <DataTemplate x:Key="DateAttributeTemplate">
            <DatePicker SelectedDate="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        </DataTemplate>
 
        <DataTemplate x:Key="FileAttributeTemplate">
            <StackPanel Orientation="Horizontal">
                <TextBox IsReadOnly="True" Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                <Button>
                    <Image Source="/Resources/icon_paperclip.png" Width="16" Height="16"/>
                </Button>
            </StackPanel>
        </DataTemplate>
 
        <selectors:AttributeTypeTemplateSelector x:Key="AttributeTypeSelector"
                                                 TextTemplate="{StaticResource TextAttributeTemplate}"
                                                 NumberTemplate="{StaticResource NumberAttributeTemplate}"
                                                 DateTemplate="{StaticResource DateAttributeTemplate}"
                                                 FileTemplate="{StaticResource FileAttributeTemplate}"/>
    </ResourceDictionary>
</Window.Resources>
 
<b:Interaction.Triggers>
    <b:EventTrigger EventName="Loaded">
        <b:InvokeCommandAction Command="{Binding LoadDataCommand}"/>
    </b:EventTrigger>
</b:Interaction.Triggers>
 
<DockPanel>
 
    <Border DockPanel.Dock="Top"
            Margin="0,5"
            BorderThickness="0,1,0,0"
            BorderBrush="Black">
        
        <TextBlock HorizontalAlignment="Center"
                   FontSize="14"
                   FontWeight="Bold"
                   Text="{Binding Type}"/>
    </Border>
    
    <StackPanel DockPanel.Dock="Bottom"
                Orientation="Horizontal"
                HorizontalAlignment="Right"
                Height="45">
 
        <Button Style="{StaticResource CornerButtonStyle}" 
                Content="Отменить заполнение"
                FontSize="14"
                Margin="0,5,5,3"
                Width="180"
                Command="{Binding}"/>
 
        <Button Style="{StaticResource CornerButtonStyle}" 
                Content="Создать"
                FontSize="14"
                Margin="0,5,5,3"
                Width="85"
                Command="{Binding}"/>
    </StackPanel>
 
    <ScrollViewer VerticalScrollBarVisibility="Auto">
        
        <Border BorderBrush="Black"
                BorderThickness="0.5"
                Margin="5">
 
            <ItemsControl ItemsSource="{Binding RowObjects}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
 
                        <Grid Margin="5">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="210"/>
                                <ColumnDefinition Width="8"/>
                            </Grid.ColumnDefinitions>
 
                            <TextBlock Grid.Column="0"
                                       Text="{Binding Name}"
                                       FontSize="14"
                                       VerticalAlignment="Center"
                                       Height="28"/>
 
                            <ContentControl Grid.Column="1"
                                            Margin="10,0,0,0"
                                            Content="{Binding .}"
                                            ContentTemplateSelector="{StaticResource AttributeTypeSelector}">
                                
                            </ContentControl>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Border>
    </ScrollViewer>
</DockPanel>
В окне отображается все кроме, тех элементов, которые должны выбираться через селектор.
Так как значение атрибута может быть разных типов (строка, число, дата и массив байт) свойство Value объекта AttributeRowObject сделал типа object. Так же некоторые из них должны быть помечены как обязательные для заполнения (должны выделяться красным пока пустые) и для числовых хочу добавить проверку ввода пользователя. Сложность в том, что в разным так скажем "режимах" кол-во этих атрибутов и какого они типа разное, поэтому решил делать через ItemsControl. Также половина данных уже заполнена из базы, а вторую половину пользователь вводит руками. Хотелось бы сделать 2 определенных textbox большей ширины, но видимо без ручного указания (такой текстбокс - такая ширина) в коде не получиться, ну точнее я не знаю как.

Почему у меня половина данных не отображается? Ошибок привязок нет, в дебаге посмотрел, свойство Value где надо заполнено, компилируется и запускается без проблем. Помогите, пожалуйста. (скрин 1 примерно что хочу видеть, скрин 2 что получаю на выходе сейчас)
Миниатюры
Не отображаются элементы в ItemsControl   Не отображаются элементы в ItemsControl  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.06.2025, 18:54
Ответы с готовыми решениями:

ListBox дефолтная стилистика для ItemsControl.ItemTemplate и ItemsControl.ItemsPanel
Как можно задать свою стилистику, по умолчанию, для ItemsControl.ItemsPanel и...

Не все ContentControl отображаются в ItemsControl
Здравствуйте, уважаемые! Уже не знаю где смотреть, да и как вопрос толком задать - не очень...

ItemsControl сортировка
В общем такая тема: Есть ItemsControl вместе с его коллекцией Items, у которого установлено...

31
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
08.06.2025, 12:16  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
вот пример со свойством для переключения типа MyObject
спасибо!
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
08.06.2025, 12:48
IIIIIIIIIgor, для общего развития.
Вот такая привязка в шаблоне Binding="{Binding MyObject.FullName}" выкидывает предупреждение.
Связано оно с тем, что свойство FullName определено не в типе MyObject, а в типе MyObjectA. В рантайм рефлексия вытянет это свойство, так как будет проверять реальный объект.
Но чтобы убрать такие предупреждения, для уменьшения случайных ошибок, в таких случаях лучше использовать полный синтаксис свойств. В данном случае так: Binding="{Binding MyObject.(local:MyObjectA.FullName)}".

Добавлено через 3 минуты
Binding="{Binding MyObject.Hardware.Name}" -> Binding="{Binding MyObject.(local:MyObjectB.Hardware).Name}"
0
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
08.06.2025, 17:17  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
для общего развития
Спасибо, учту
0
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
09.06.2025, 13:30  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
вот пример со свойством для переключения типа
на том тестовом проекте все работает, пробую перенести в рабочий и получаю эксепшен.

в словаре ресурсов объявил
XML
1
2
3
4
5
6
7
8
9
<DataTemplate x:Key="ToolsDGrid"
              DataType="{x:Type vm:MainViewModel}">
    <DataGrid Style="{StaticResource DGStyly}"
              ItemsSource="{Binding TableRows}"
              SelectedItem="{Binding SelectedObj}"
              ToolTipService.ShowOnDisabled="True">
 
<selectors:TableRowTemplateSelector x:Key="tableRowSelector"
                                    ToolTemplate="{StaticResource ToolsDGrid}"/>
XML
1
2
3
4
5
6
7
<GroupBox Grid.Column="2"
          Margin="3"
          Header="Найдено:"
          FontSize="14">
 
    <ContentControl ContentTemplate="{Binding}"
                    ContentTemplateSelector="{StaticResource tableRowSelector}"/>
в самом xaml ContentControl подсвечивается с ошибкой "Ссылка на объект не указывает на экземпляр объекта."
и когда запускаю в классе селектор item приходит null и соответственно получаю эксепшен.

при создании окна VM передаю ему в DataContext, со всем остальным проблем нет

C#
1
2
3
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
    var vm = (MainViewModel)item;
не знаете из-за чего такое может быть? что я упустил делал так же как на тестовом приложении
в тестовом мб как-то вм по другому (особенно) создавалась не заметно для меня, что она передавалась ни как null?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
09.06.2025, 14:37
Цитата Сообщение от IIIIIIIIIgor Посмотреть сообщение
в самом xaml ContentControl подсвечивается с ошибкой "Ссылка на объект не указывает на экземпляр объекта."
Код TableRowTemplateSelector тот же?
0
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
09.06.2025, 14:41  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Код TableRowTemplateSelector тот же?
да, только названия поменял.

по xaml отличия в том что в тестовом DataContext задается в самом xaml, а тут я при создании окна в контекст пихаю вм. мб это как то повлияло?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
09.06.2025, 14:48
Лучший ответ Сообщение было отмечено IIIIIIIIIgor как решение

Решение

Цитата Сообщение от IIIIIIIIIgor Посмотреть сообщение
в тестовом мб как-то вм по другому (особенно) создавалась не заметно для меня, что она передавалась ни как null?
В Тестовом DataContext создавался в XAML.
Поэтому на момент создания ContentControl в него уже передавался экземпляр VM.
А сейчас вы, как я думаю, DataContext передаёте уже после создания Окна, соответствено, и после инициализации XAML.
Поэтому на момент создания ContentControl в него передаётся null.

Два варианта решения:
1) Этот мне нравится больше. Создать в App.xaml в Ресурсах источник для экземпляра VM. Это может быть просто экземпляр с ключом, или локатор в одном из свойств которого экземпляр VM. Окно в XAML само вытягивает этот экземпляр к себе в DataContext;
2) Добавить в TableRowTemplateSelector проверку на нулевой item, или на проверку по шаблону. И возвращать null или пустой шаблон, если item не экземпляр VM.

Добавлено через 41 секунду
Цитата Сообщение от IIIIIIIIIgor Посмотреть сообщение
по xaml отличия в том что в тестовом DataContext задается в самом xaml, а тут я при создании окна в контекст пихаю вм. мб это как то повлияло?
Да. В этом.
Долго ответ писал.
1
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
09.06.2025, 15:20  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Создать в App.xaml
у меня нет его, так как это не приложение WPF, а библиотека пользователь элементов управления, которая как плагин запускается из под стороннего приложения.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Добавить в TableRowTemplateSelector проверку на нулевой item, или на проверку по шаблону. И возвращать null или пустой шаблон, если item не экземпляр VM.
вот это помогло. я думал все инициализируется и создается уже непосредственно при вызове метода Show.
правда теперь какие ошибки привязки повылазили целых 16 штук, но на работу вроде не влияют

Добавлено через 4 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
вот пример со свойством для переключения типа MyObject
почему может не работать ToolTip? он даже в тестовом не отображает подсказку

еще сможете объяснить почему : если делаю вот так:
XML
1
Binding="{Binding MyObject.(local:MyObjectA.FullName)}"
то в xaml ошибок нет. но при запуске получаю ошибки привязки: "BindingExpression path error: '(local:MyObjectA.FullName)' property not found on 'object' ''MyObjectA' (HashCode=31780825)'. null"
а если вот так :
XML
1
Binding="{Binding MyObject.FullName}"
в xamlесть ошибки, но после запуска нет ошибок привязки....
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
09.06.2025, 17:51
Цитата Сообщение от IIIIIIIIIgor Посмотреть сообщение
то в xaml ошибок нет. но при запуске получаю ошибки привязки: "BindingExpression path error: '(local:MyObjectA.FullName)' property not found on 'object' ''MyObjectA' (HashCode=31780825)'. null"
Не знаю.
Надо смотреть в дебагере.
0
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
09.06.2025, 18:12  [ТС]
Элд Хасп,
Цитата Сообщение от IIIIIIIIIgor Посмотреть сообщение
почему может не работать ToolTip? он даже в тестовом не отображает подсказку
по этому сможете подсказать?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
09.06.2025, 20:14
Цитата Сообщение от IIIIIIIIIgor Посмотреть сообщение
почему может не работать ToolTip? он даже в тестовом не отображает подсказку
У вас не инициализированы эти свойства в TableRowObject.
Добавьте им значения:
C#
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
        private void OnLoadDataCommand(object p)
        {
            if (MyObjectType == typeof(MyObjectA))
            {
                TableRows = new ObservableCollection<TableRowObject>()
                {
 
                    new TableRowObject()
                    {
                        MyObject = MyObjectA.Parse("Один ; Один один ; Карты 1, карта2 ; 5"),
                        IsEnabled = true,
                        ToolTip = "Подсказка 1"
                    },
                    new TableRowObject()
                    {
                        MyObject = MyObjectA.Parse("Один ; Один один ; Карты 1, карта2 ; 5"),
                        IsEnabled = false,
                        ToolTip = "Подсказка"
                    },
                    new TableRowObject()
                    {
                        MyObject = MyObjectA.Parse("Один ; Один один ; Карты 1, карта2 ; 5"),
                        IsEnabled = true,
                        ToolTip = "Подсказка 2"
                    },
                    new TableRowObject()
                    {
                        MyObject = MyObjectA.Parse("Один ; Один один ; Карты 1, карта2 ; 5"),
                        IsEnabled = true,
                        ToolTip = "Подсказка 3"
                    },
                };
            }
Добавлено через 3 минуты
Если нужен вывод над отключенной строкой, то нужно задать значение ToolTipService.ShowOnDisabled.
XML
51
52
53
54
55
56
57
58
59
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
                <Setter Property="ToolTip" Value="{Binding ToolTip}"/>
                <Setter Property="ToolTipService.ShowOnDisabled" Value="True"/>
            </Style>
        </DataGrid.RowStyle>
    </DataGrid>
</DataTemplate>
1
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
09.06.2025, 20:27  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если нужен вывод над отключенной строкой, то нужно задать значение ToolTipService.ShowOnDisabled.
А я его задавал для DataGrid а надо было в RowStyle... Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.06.2025, 20:27

Как реализовать Multibinding в ItemsControl
Помогите, пожалуйста, реализовать Multibinding. Существует класс Movie, в котором есть свойство...

Условный вывод Item'a в ItemsControl
Добрый день. В окне есть ItemsControl с забинденной к нему коллекцией объектов некоторого класса X....

Плавное изменение размера окна, когда ItemsSource у ItemsControl очищается и заполняется
Подскажите как это сделать? &lt;view9:ErrorMessageControl Grid.Column=&quot;0&quot; ...

Странное поведение ItemsControl
Имеется UserControl, xaml такой: &lt;Grid x:Name=&quot;LayoutRoot&quot; Tap=&quot;LayoutRoot_Tap&quot;&gt; ...

GridSplitter внутри ItemsControl
Никак не могу сделать обыкновенный сплиттер внутри контейнера. XAML такой: &lt;ItemsControl...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru