215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
|
|||||||||||
1 | |||||||||||
WPF Привязать свойство в коде с Text у TextBox19.05.2019, 22:05. Показов 6221. Ответов 9
Метки нет (Все метки)
0
|
19.05.2019, 22:05 | |
Ответы с готовыми решениями:
9
TextBox и свойство text Назначить TextBox свойство Text? Задать свойство Text элемента TextBox Как сохранить свойство Text элемента TextBox после закрытия программы? |
Модератор
|
||||||
19.05.2019, 22:43 | 2 | |||||
Работает, но не происходит обновление значения в WPF элементе.
Если Вы проверите в коде C#, то увидите, что свойство имеет другое значение. Для обновления значения в привязке к CLR свойству, это свойство должно уведомить об изменении своего значения через интерфейс INotifyPropertyChanged. Для Вашего примера, подойдёт такая реализация.
1
|
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
|
|
19.05.2019, 23:00 [ТС] | 3 |
Элд Хасп, ваше решение не работает, может быть что-то в xaml прописать нужно?
0
|
Модератор
|
|||||||||||
19.05.2019, 23:23 | 4 | ||||||||||
Да, нужно - я и не посмотрел там.
У Вас же не установлен DataContext! Привязку Вы к чему собственно делаете? Binding - это привязка к DataContext.Добавлено через 2 минуты На свойство UC можно сослаться через ElementName
Можно сослаться на тип родительского элемента
1
|
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
|
||||||
19.05.2019, 23:55 [ТС] | 5 | |||||
Элд Хасп, спасибо! Можно еще 1 вопрос чтобы окончательно закрыть тему.
А как сделать привязку к DataContext, чтобы просто писать Binding Price, Binding Name и т.д, без ElementName=numericUpDown. Так почему то не работает, критует "System.StackOverflowException" при запуске программы
0
|
Модератор
|
|||||||||||
20.05.2019, 00:21 | 6 | ||||||||||
Сообщение было отмечено Defences как решение
Решение
DataContext - это свойство для подключения VM. Если в UC не передаётся внешняя VM и источником данных служит он сам, то можно использовать его CB в качестве VM.
Подключение можно сделать как в CB, так и в XAML. Выберите тот вариант, который Вам удобнее. Я предпочитаю в XAML. Вариант №1 В CB окна указывается ссылка на самого себя
1
|
Модератор
|
|||||||||||
20.05.2019, 00:22 | 7 | ||||||||||
Сообщение было отмечено Defences как решение
Решение
Вариант №2
CB не трогается в XAML указывается ссылка на самого себя
1
|
Модератор
|
||||||
20.05.2019, 00:22 | 8 | |||||
Сообщение было отмечено Defences как решение
Решение
Вариант №3
Для UC есть ещё нюанс. UC - это WPF элемент. А у WPF элемента должны быть не CLR-свойства, а DP-свойства. Представьте себе использование UC в View. Там у Вас есть VM тоже с CLR-свойствами. И как теперь связать между собой два CLR-свойства? Это целый геморрой! Поэтому делать надо так
1
|
Модератор
|
||||||||||||||||
20.05.2019, 01:03 | 9 | |||||||||||||||
Сообщение было отмечено Defences как решение
Решение
Вариант №4
Другой нюанс. Все эти варианты - это варианты с неизолированной локальной VM. Что это означает... При создании UC запускается конструктор в CB. Оттуда вызывается InitializeComponent() в котором происходит инициализация XAML разметки. Если в ней указан DataContext, то он тоже устанавливается.После вызова InitializeComponent код CB работает дальше. Если в нём указано присвоение DataContext, то DataContext изменяет значение. После создания элемента он передаётся в код откуда вызывалось его создание. И теперь если в коде опять установится DataContext (а если хоть на каком-то уровне выше идёт привязка к VM, то он тоже устанавливается), то DataContext UC изменится и может нарушится его работа. Допустим, если бы не установили тип DataContext
Text="{Binding Price}" искала бы свойство во внешнем DataContext. А кнопки меняли бы внутренний, в результате - неправильная работа.Но установка проверки типа не защищает от ошибок. Допустим, если объявление UC в View делать так, то работа UC нарушится
То есть методы инкремента/декремента в кнопках тоже должны работать не с просто Price, а с этим свойством DataContext. Получить его можно через рефлексию.
1
|
Модератор
|
|||||||||||||||||||||
20.05.2019, 01:25 | 10 | ||||||||||||||||||||
Сообщение было отмечено Defences как решение
Решение
Вариант №5
Но всегда ли нужно такое поведение? Допустим, если сейчас проверить в View значение свойств Price у ViewModel и UC то они окажутся разными! Код ViewModel
Но всегда ли это нужно? Если у нас в UC есть внешнее DP-свойство которое при необходимости мы можем привязать к VM, нужна ли нам VM ещё и в DataContext? По разному. Очень часто не нужна. В этом случае надо изолировать локальную VM. Один из простых способов это задать DataContext не самому UC, а его главному контейнеру. В данном случае это Grid.
Это свойство теперь надо явно привязать к свойству UC.
1
|
20.05.2019, 01:25 | |
20.05.2019, 01:25 | |
Помогаю со студенческими работами здесь
10
Template и свойство TextBox-а "Text" Как заставить свойство "Text" компонента Label забиндиться на свойство TheChar из пользовательского класса Сохранение текста (label.text или textBox.text) для повторного использования Как привязать свойство к переменной? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |