|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
Доброго времени! Поясню контекст задачи. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Есть базовое окно, содержащее, к примеру, поле "выбранный язык". При своей инициализации оно инициализирует (но пока не рисует) модальное окно, куда надо передать (через его конструктор) этот самый язык. Прикол в том, что последовательность получается такая: 1. Инициализируем главное и дочернее окно, язык еще не выбран, в дочернее уходит null. 2. Выбираем язык ChooseLang. 3. Открываем дочернее окно. В нем лежит переданный ранее null, т.е. оно не смотрит на текущее значение поля в родительском окне, а хранит первоначально переданное значение. Вопрос: как сделать так, чтобы передать не значение поля _lang, а ссылку на саму переменную, и если та обновиться, то в дочернем классе мы будем иметь доступ к актуальным данным? В С++ я бы просто передал адрес поля. В C# можно передать через ref, но это переданное значение я не могу сохранить как поле дочернего объекта (нельзя объявлять данные-члены с модификатором ref). P.S. это понятно, что надо передавать не через конструктор, а при рисовании окна и т.п. Ну вот такие ограничения, не получится. Большой сложный проект с кучей IoC-контейнеров, динамических конструкторов View и прочего, перелопатить это не реально, все что я могу - что-то передать в конструктор дочернего окна, это должно сохраниться в объекте, а при показе окна - подтянуть актуальные данные. P.P.S. пока есть одно решение: передавать IEnumerable<ILang>, генерировать его через yield. Работает, но это не красиво, передавать один элемент словно это коллекция. Неужели в .net нет обертки, типа Ref<T> ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 09:49 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
TimeCoderP.S. это понятно, что надо передавать не через конструктор, а при рисовании окна и т.п. странно как то. Проперти в модальном окне никак не сделать и спокойно получить значение после ShowDialog? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 10:20 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
TimeCoder, Я имхо понял что язык это язык приложения, если это так то это глобальные данные для всего приложения, и с любого места можно получить к ним доступ из программы в любое время, вы в каждой форме держите поле для этого? - как бы забавно.. для этого подойдет любое глобальное публичное статическое поле- свойство, вообще для таких дел нужно использовать модель settings она стандартна вшита в студию, все таки имхо лучше пересмотреть, чем инжектировать через конструктор.. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 10:31 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
ИзопропилПроперти в модальном окне никак не сделать и спокойно получить значение после ShowDialog? Ну так а как? ShowDialog покажет дочернее окно, в процессе чего у него должно быть актуальное значение поля из родительского окна. Но обратиться напрямую оно туда не может, т.к. ничего о нем не знает (и не должно). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 10:58 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
Где-то в степинужно использовать модель settings Это глобальное хранилище данных, что в данном случае неправильно: ведь речь идет о поле, существующем только в пределах одного класса, и передаваемое во второй. Остальному "миру" эти данные видеть нет смысла. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 11:00 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
TimeCoder(и не должно). конечно. И модальное окно никаких побочных эффектов создавать не должно- спросить что-то у пользователя и вернуть результат. Использование результата - забота вызывающего Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 11:11 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
TimeCoder, Вы в каком типе храните признак языка, уж не в string ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 11:11 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
Где-то в степи, а пардон, не увидел ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 11:14 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
Изопропил, там так не получится, перед показом модального окна что-то в него докинуть. Вызов происходит движком проекта, неявно, где-то в дебрях кода. Как я сказал, единственное, что мне доступно - это передавать параметры через конструктор модального окна. И фактически, мне нужно передать не содержимое ссылочного поля, а его адрес (т.к. содержимое может меняться). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 12:38 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
TimeCoder, попробуйте так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 12:56 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
TimeCoderИ фактически, мне нужно передать не содержимое ссылочного поля, а его адрес Т.е. ты не можешь обработать результат работы модального окна - правильно понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 13:09 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
Где-то в степи, так не получится по той причине, что модальное окно используется не только здесь. Т.е. оно ничего не должно знать о родителе. Ну можно конечно родителя запрятать за какой-то интерфейс, но это уже огород) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 13:43 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
PallarisTimeCoderИ фактически, мне нужно передать не содержимое ссылочного поля, а его адрес Т.е. ты не можешь обработать результат работы модального окна - правильно понимаю? В родительском окне? Может и могу, надо глянуть, но мне зачем обрабатывать его результат? Тут наоборот, при показе модального окна, оно использует свое поле данных, установленное ранее через конструктор от главного окна (но значение которого надо "перезагрузить"). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 13:45 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
TimeCoder, попробуй так Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 14:11 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
Где-то в степи, топикстартер и просил враппер типа Ref<T> : Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 16:29 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
Изопропил, ну а в чем проблема? можно еще таймер приделать что бы лампочки моргали )) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 16:42 |
|
Сохранить ссылку на ссылку
|
|||
---|---|---|---|
#18+
TimeCoderНу можно конечно родителя запрятать за какой-то интерфейс, но это уже огород) Не огород, а вполне приемлемое решение. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 16:43 |
|
|
start [/forum/topic.php?fid=20&gotonew=1&tid=1403968]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
107ms |
get topic data: |
12ms |
get first new msg: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 323ms |
total: | 532ms |
0 / 0 |