13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
|
|
1 | |
[WPF] Привязка свойств контролов к значениям локальных переменных16.12.2016, 20:00. Показов 5255. Ответов 15
Метки нет (Все метки)
Имеется List, в котором, допустим, по индексу 0 содержится булевое значение, определяющее должен ли быть checkbox ischecked (true) или наоборот.
Мне нужно в xaml разметке сделать привязку к этому листу и указать обращение к первому элементу. То что я имею ввиду: IsChecked="{Binding local:App.AnyList[0]}". Поскольку с binding'ом к локальным переменным не знаком, задаю банальный вопрос: это двусторонняя связь? При изменении ischecked меняется ли значение, к которому оно привязано? В гугле ответа не нашёл конкретно про листы.
0
|
16.12.2016, 20:00 | |
Ответы с готовыми решениями:
15
Рассмотреть программу, написать имена глобальных переменных, локальных переменных, формальных параметров Создание свойств у контролов Изменение свойств вложенных контролов Перебор контролов с изменением свойств |
16.12.2016, 23:43 | 2 | |||||
dm stark, почему элементы должны храниться в List ?
Можно вот так схитрить:
0
|
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
|
|
17.12.2016, 08:57 [ТС] | 3 |
Да нет. Не совсем в привязке дело. Мне нужно это для хранения настроек. Чтобы можно было из List KeyValuePairs доставать по Key (string) конеретные значения (bool в данном случае). Это не только для checkbox'ов. Пока с ними надо разобраться)
List использую, потому что Dictionary не сериализуем XmlSerializer. Как-то же я должен настройки сохранить... Да и связь должна быть двусторонней: меняешь checkbox - меняется значение.
0
|
17.12.2016, 13:44 | 4 |
Если указать тип привязки TwoWay получишь двустороннею привязку. У чекбокса она по умолчанию двусторонняя.
Обязательно нужно в xml сериализовать? Есть еще бинарный формат. Кроме того можно написать свой механизм для чтения/записи в xml. Читать тут. Я бы примерно так и поступил: 1. Создал view model для настроек. 2. Создал свойство для привязки каждой настройки. 3. При старте приложения загружал сохраненные настройки. 4. При изменении настроек переписывал данные в файле. MVVM подход тем и хорош, что ты берешь данные (model) делаешь для них обертку, удобную для работы (view model) и отображаешь данные как нужно в view. Если List используется ради самого List, то это не самое лучшее решение. Тем более, что для его использования нужно городить костыли.
0
|
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
|
|
17.12.2016, 14:21 [ТС] | 5 |
Да. Бинарная сериализация получше будет)
Но зачем для каждой настройки свойство делать? Я видел как то можно через свой класс наследуемый от Binding. Там в Source просто Dictionary даётся с настройками. А далее используеься этот класс в привязке. Как это можно сделать? Как такой класс написать? Он не большой.
0
|
17.12.2016, 16:07 | 6 |
Если у тебя для каждой настройки будет отдельный UI элемент, то наиболее логично сделать отдельное свойство и не искать тяжелых путей.
Если все настройки будут в одном элементе типа ListView (я использую GridControl от devexpress, но он платный). Тогда тебе нужна ViewModel отвечающая за отдельную настройку (например с свойствами Name, Value и т.д.). Эти VM будут храниться в ObservableCollection, которую нужно привязать к свойству ItemSource. Если нужны разные типы контролов для настроек то можно использовать ItemTemplateSelector. Таким образом ты получишь коллекцию с настройками, но ни List ни Dictionary не являются кандидатами на эту роль.
0
|
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
|
|
17.12.2016, 18:41 [ТС] | 7 |
Не. У меня настройки для всего приложения. Там несколько страниц. Никакого одного ListView нет. Всё в Grid по обычному)
Вот статья, но что-то не получается. Объясните, пожалуйста, в чём проблема: http://www.broculos.net/2014/0... FP2YhuLSM_ Добавлено через 3 минуты А где про свойства: у меня есть класс ApplicationSettings, где в Dictionary хранятся все настройки; я должен просто сделать свойства в каком-нибудь статическом классе, где извлекаю из Dictionary нужные значения в get property и изменяю в аксессоре set. Так я понимаю? Но у меня там свойств под сотню будет... Добавлено через 30 минут Думаю более правильно найти тяжёлый, но требующий много кода способ, чем описывать всё свойства. Многовато выйдет. Добавлено через 1 час 23 минуты *не требующий много кода способ
0
|
17.12.2016, 19:04 | 8 | |||||||||||||||
Можно использовать генерацию кода. В VS есть такая штука t4.
Я с его помощью генерирую базовый набросок view model с model (тип и имя свойства модели извлекаю через рефлексию). На сколько я понял, он использует некую абстракцию над механизмом настоек WPF проекта. Его класс позволяет вводить настройки не в дизайнере, а в коде.
Правда мне не понятно как обновляются привязки при изменении источника (настройки), так как класс не реализует INotifyPropertyChanged. Но grid то один? Я предлагал следующее решение:
Я использую вот такой подход.
1
|
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
|
||||||
17.12.2016, 21:36 [ТС] | 9 | |||||
Лучше синглтон. В моём классе настроек это уже реализовано. Сейчас переделаю как вы написали.
Добавлено через 21 минуту Спасибо Добавлено через 1 час 9 минут Поясните пожалуйста следующее: я вот заменю ItemSource в своём случае на Settings. да и зачем мне реализовывать INotifyPropertyChanged? чтобы при изменении сразу в файл вносить данные. Но вы представляете когда куча настроек, какая это будет нагрузка? Каждый раз всю коллекцию сериализовать бинарно, зашифровать, записать. я просто ещё шифрую настройки. мне не нужна реализация этого интерфейса. я лучше в background потоке буду каждые 5 минут это делать и при событии app.exit. мне менять collection на dictionary? а для checkbox'ов тогда как вот это сделать? установить в datacontext="local:classname" ischecked="{Binding *как то извлечь из dictionary keyvalue по строковому key*}"??? Вот и вернулись к исходному вопросу. Добавлено через 38 минут ладно. просто можете написать свой пример как было только для checkbox. без какого-либо listview. вот вся разметка для вас:
0
|
17.12.2016, 22:16 | 10 |
нужен для того, что бы при изменении источника т.е. значения настройки, все элементы которые его используют подтянули новое значение. При изменении одной настройки не обязательно обновлять файл с настройками. Это вообще 2 разные задачи.
Настройки можно сохранять при закрытии view с настройками или через определенное время в фоне. Не понял вопроса.
0
|
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
|
|
17.12.2016, 22:17 [ТС] | 11 |
А.. Понял с propchenged.
Ну. свой пример использования класса AppSettingsViewModel для задания свойства ischecked checkbox'а. без всяких listview.
0
|
17.12.2016, 22:42 | 12 |
Ага, т.е. что бы без коллекции настроек. Тогда был бы класс с свойством для каждой настройки. DataContext устанавливал бы элементу верхнего уровня, который содержит grid с контролами. Делал бы это с застраничного кода, так как бы ресолвил его через ServiceLocator. По идее если AppSettingsViewModel будет синглтоном, то можна оставить вариант с установкой DataContext в XAML.
0
|
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
|
|
17.12.2016, 22:59 [ТС] | 13 |
Выходит, невозможно связать свойство контрола со значением dictionary?
Добавлено через 24 секунды Ну как то же это делают по ссылке я вам дал. Добавлено через 14 минут а.. ну там вообщем тоже свойства. мда. жаль что со свойствами тыкаться приходится))
0
|
18.12.2016, 01:25 | 14 |
Видимо такая модель была выбрана при создании WPF. Если мы хотим что то использовать как источник данных, то нужен способ отслеживать изменения этих данных. Свойство просто оказалось удобной абстракцией.
0
|
40 / 32 / 7
Регистрация: 24.03.2016
Сообщений: 270
|
||||||||||||||||||||||||||
25.12.2016, 04:45 | 15 | |||||||||||||||||||||||||
Я пролистал вниз и увидел только что-то про "нельзя бинд делать на словарь", вот вам, используйте, и привязывайтесь Добавлено через 1 минуту
Добавлено через 38 секунд
Добавлено через 51 секунду А тот самый SelectedBoss, это Интовое свойство, что реализует так же OnPropertyChanged Добавлено через 1 минуту dm stark, а вообще у меня настройки сохраняются просто в текстовый файл, а не бинарно сериализуются, что б я смог их изменить вне приложения, как конфиг, знаете?) И там тоже есть значения булевые для тоглбаттонов Добавлено через 58 секунд
Добавлено через 53 секунды Затем чтение при запуске :
2
|
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
|
|||||||||||
25.12.2016, 13:54 [ТС] | 16 | ||||||||||
Сами писали ObservableDictionary?)
Чтение настроек мне не подходит. Они шифруются. Это не портативная программа, а приложение для широкого пользования (будет как бы =). Поэтому использую бинарную сериализацию. А так, я уже решил данную проблему. У меня класс ApplicationSettings со статическим свойством Settings. Есть свои методы Add (по сути, как Add так и Set), Remove, Get из Settings. В конструкторе дешифрую и десериализую, а так же запускаю background поток для сохранения настроек по таймеру и при app.exit. Мне нет резона каждый раз ловить уведомление о том, что коллекция была изменена. Это какая нагрузка выйдет. Каждый раз шифровать, сериализовать и перезаписывать... А настроек у меня в приложений не мало. Так использую в разметке:
0
|
25.12.2016, 13:54 | |
25.12.2016, 13:54 | |
Помогаю со студенческими работами здесь
16
Привязка контролов к настройкам Привязка контролов к окну Изменение свойств нескольких контролов триггером Изменение свойств контролов по массиву имен Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |