Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
WPF

DP UserControl внутри UserControl MVVM

03.08.2019, 06:00. Показов 2831. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть UC c DP Text

XML
1
2
3
  <Grid>
        <TextBlock HorizontalAlignment="Left" Text="{Binding Text, ElementName=UC}" VerticalAlignment="Top" Foreground="White"/>
    </Grid>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 public partial class UserControlA : UserControl
    {
        public UserControlA()
        {
            InitializeComponent();
        }
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register(nameof(Text), typeof(string),
                typeof(UserControlA),
                new FrameworkPropertyMetadata
                {
                    DefaultValue = default(string),
                    BindsTwoWayByDefault = true
                });
    }
Все, можем кидать его на форму и делать привязку к Text из ViewModel.
А как быть, если этот UC нужно поместить внутрь другого UC, дублировать DP?

Так?

UC который содержит UC, который выше

XML
1
2
3
 <Grid>
        <local:UserControlA Height="100" Text="{Binding Text, ElementName=UC}"/>
    </Grid>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 public partial class UserControlMany : UserControl
    {
        public UserControlMany()
        {
            InitializeComponent();
        }
 
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register(nameof(Text), typeof(string),
                typeof(UserControlMany),
                new FrameworkPropertyMetadata
                {
                    DefaultValue = default(string),
                    BindsTwoWayByDefault = true
                });
    }

Можно каким-то образом не дублировать DP UserControlA в UserControlMany?

Добавлено через 6 минут
Как-то так можно? Или дублировать обязательно?
XML
1
2
3
   <Grid>
        <local:UserControlA x:Name="UC_A" Height="100" Text="{Binding Text, ElementName=UC}"/>
    </Grid>
C#
1
2
3
4
5
 public DependencyProperty Text
        {
            get { return UC_A.TextProperty; }
            set { UC_A.TextProperty = value; }
        }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.08.2019, 06:00
Ответы с готовыми решениями:

Кастомная кнопка в UserControl или UserControl со свойствами кнопки
Привет, пытаюсь запихнуть кастомную кнопку в Useк Control. Что-то ерунда какая-то получается. Можете помочь? Хотелось бы UC со...

WPF MVVM View и ViewModel или UserControl и DependencyProperty
Не так давно ударился в WPF и шаблон MVVM. Вот такой вопрос возник... У меня есть View которая &quot;собирается&quot; из более мелких View....

MVVM View UserControl и Storyboard не понятно как триггером запустить анимацию
Пусть есть MainViewModel : public class MainViewModel : INotifyPropertyChanged { private string _myString; ...

6
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,080
Записей в блоге: 2
03.08.2019, 10:55
Цитата Сообщение от Defences Посмотреть сообщение
Можно каким-то образом не дублировать DP UserControlA в UserControlMany?
Что такое дублирование? Такой термин подразумевает дублирование экземпляра или кода.

А то что вы описываете это просто создание экземпляра одного класса в другом классе.

Скорее всего вам нужно наследование одного UC от другого.
Но это лучше делать без XAML - полностью на C#.

Добавлено через 22 минуты
Цитата Сообщение от Defences Посмотреть сообщение
Есть UC c DP Text
Код UserControlA
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
    public class UserControlA : UserControl
    {
        public UserControlA()
        {
            Grid grid = new Grid();
            TextBlock tbl = new TextBlock();
            Binding bind = new Binding(nameof(this.Text))
            {
                Source = this
            };
            tbl.SetBinding(TextBlock.TextProperty, bind);
            grid.Children.Add(tbl);
            AddChild(grid);
        }
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register(nameof(Text), typeof(string),
                typeof(UserControlA),
                new FrameworkPropertyMetadata
                {
                    DefaultValue = default(string),
                    BindsTwoWayByDefault = true
                });
    }
Но как потом в наследника добавлять элементы? Это тоже всё надо делать на C# или изменить код UserControlA так чтобы в его Grid можно было добавлять элементы из XAML.

Надо в целом продумать что нужно в конечной реализации.
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
03.08.2019, 12:22  [ТС]
Элд Хасп, вы меня не так поняли. Есть UserControl ( A ) с DP, к примеру как выше Text. И есть UserControl (Main) который вмещает в себя 2 UC (A). UC (Main) кидается на форму и чтобы иметь возможность привязать, нужно в UC (Main) дублировать DP для UserControl A

этот UserControl мы кидаем на другой UserControl

XML
1
2
3
<Grid>
        <TextBlock HorizontalAlignment="Left" Text="{Binding Text, ElementName=UC}" VerticalAlignment="Top" Foreground="White"/>
    </Grid>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public partial class UserControlA : UserControl
    {
        public UserControlA()
        {
            InitializeComponent();
        }
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register(nameof(Text), typeof(string),
                typeof(UserControlA),
                new FrameworkPropertyMetadata
                {
                    DefaultValue = default(string),
                    BindsTwoWayByDefault = true
                });
    }
XML
1
2
3
4
<Grid>
        <local:UserControlA Height="100" Text="{Binding Text1, ElementName=UC}"/>
        <local:UserControlA Height="100" Text="{Binding Text2, ElementName=UC}"/>
    </Grid>
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
public partial class UserControlMany : UserControl
    {
        public UserControlMany()
        {
            InitializeComponent();
        }
 // Вот эти DP которые по сути уже объявлены в UserControl A, обязательно тут дублировать? Можно ли как-то иначе дать доступ к биндигам из ViewModel формы
        public string Text1
        {
            get { return (string)GetValue(Text1Property); }
            set { SetValue(Text1Property, value); }
        }
        public static readonly DependencyProperty Text1Property =
            DependencyProperty.Register(nameof(Text1), typeof(string),
                typeof(UserControlMany),
                new FrameworkPropertyMetadata
                {
                    DefaultValue = default(string),
                    BindsTwoWayByDefault = true
                });
    }
public string Text2
        {
            get { return (string)GetValue(Text2Property); }
            set { SetValue(Text2Property, value); }
        }
        public static readonly DependencyProperty Text2Property =
            DependencyProperty.Register(nameof(Text2), typeof(string),
                typeof(UserControlMany),
                new FrameworkPropertyMetadata
                {
                    DefaultValue = default(string),
                    BindsTwoWayByDefault = true
                });
    }
Миниатюры
DP UserControl внутри UserControl MVVM  
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
03.08.2019, 12:27  [ТС]
Точнее не дублирование, а прослойка.
Просто меня смущает этот момент с прослойкой, а если такая матрешка из 5 UserControl'ов, получается нужно в каждом слою пробрасывать новое DP. Я хочу понять, нормально ли это для WPF или нет.
0
1595 / 600 / 185
Регистрация: 05.12.2015
Сообщений: 970
03.08.2019, 12:57
Без практического примера такое обсуждение - ни о чем.
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
03.08.2019, 13:21  [ТС]
proa33, всмысле? Выше полный код юзер контрола который кидается на форму и который внутри этого UC. Я не все тонкости знаю, но мне видится бредово пробрасывать DP одного UC в другой, при том что не просто пробросить, а прям заного регистрировать. Хочу понять, есть ли другой путь или только так поступать.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,080
Записей в блоге: 2
03.08.2019, 15:42
Лучший ответ Сообщение было отмечено Defences как решение

Решение

Цитата Сообщение от Defences Посмотреть сообщение
Выше полный код юзер контрола который кидается на форму и который внутри этого UC. Я не все тонкости знаю, но мне видится бредово пробрасывать DP одного UC в другой, при том что не просто пробросить, а прям заного регистрировать. Хочу понять, есть ли другой путь или только так поступать.
В том виде в котором вы описываете это единственно возможное.
UC это такой же контрол как и, допустим, TextBlock.
Вас же не смущает, что для биндинга внутреннего TextBlock в UserControlA вам приходится объявлять в UserControlA DP-свойство.
По отношению к UserControlMany UserControlA такой же внутренний контрол. И если надо "вытащить" его свойство наружу, то так же как и с TextBlock надо объявлять DP-свойство.

Другое, дело что возможно для вашей задачи существует другой путь решения.
Как уже написал proa33 - Без практического примера такое обсуждение - ни о чем.
Вы в ответ описываете какие вам нужны инструменты для выбранного вами пути решения. А речь идёт о другом опишите свою задачу в целом, что вы хотите реализовать и, возможно, для реализации можно будет выбрать другой путь и другие инструменты.

Добавлено через 11 минут
Почему я выше писал, что для решения вашей задачи (в том виде каком вы её представили) нужно создание UC в C#.
Можно объявить вложенный контрол публичным. Но это будет публичное ПОЛЕ. А в XAML к полям обращаться невозможно. Так же в XAML невозможно задать значения СЛОЖНОМУ СВОЙСТВУ.

Допустим, вы смогли сделать внутренний контрол свойством. У этого свойства будут свои вложенные свойства - одно из них Text. Так вот объявить привязку к свойству свойства или задать ему значение в XAML невозможно. На C# это без проблем. В том числе, через рефлексию можно "достучаться" и до защищенных свойств.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.08.2019, 15:42
Помогаю со студенческими работами здесь

Управление usercontrol из другого usercontrol
На форме размещено 2 usercontrol. Как управлять usercontrol из другого Добавлено через 22 часа 33 минуты Что не кто не поможет?

Slider внутри UserControl
Помогите разобраться со следующим вопросом. У меня есть UserControl, внутри которого есть Slider, TextBox, в котором отображается...

Как правильно сделать datacontext binding для UserControl внутри StackPanel?
Есть класс TFSTask в котором есть поля: id, fields(класс состоит из полей описывающих таск), operationType. Это задача которую я получаю...

UserControl
как добавить на Grid в WPF свой UserControl из DLL(UserControl для WPF) Добавлено через 1 час 33 минуты, потому что никто так и не...

Компоновка UserControl
Новичок в WPF. Прошу опытных разработчиков помочь. Мне нужно сделать юзер контрол с привязкой к данным. С привязкой я разобрался, а вот...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru