Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
WPF Binding: изменение объектов не обрабатывается байднигом
|
|||
|---|---|---|---|
|
#18+
Джентельмены, я к WPF ной теме обращаюсь эпизодически, поэтому отнеситесь снисходительно если задаю глупый вопрос. Объясните плиз почему не срабатывает байндинг на примере следующего кода.. using System; using System.ComponentModel; using System.Globalization; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using Xunit; namespace Maria.Common.WPF.xUnit { public class UpdateDataTest { /// <summary> /// Тест показывающий что изменение объектов не обрабатывается байднигом /// </summary> [Fact ]//(Skip = "Обламывается пока ") public void UpdateData() { var tb = new TextBox(); var test2 = new Test2(); var b = new Binding { Mode = BindingMode.OneWay, // , Path = new PropertyPath("Name") Converter = new TestConverter() }; tb.SetBinding(TextBox.TextProperty, b); test2.Name = "Name"; Assert.True(tb.Text == test2.Name); } class Test2 : INotifyPropertyChanged { private string _Name; public string Name { get { return _Name ;} set { _Name = value; OnPropertyChanged("Name"); } } public event PropertyChangedEventHandler PropertyChanged; void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } class TestConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return ((Test2)value).Name; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return value; } } } } --------- То есть свойство Name при изменении не отражается в забайнденном тексбоксе. Я так понял что проблема в том что у события OnPropertyChanged нет обработчика.. В какой момент он должен назначаться? В общем в чем косяк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 13:35 |
|
||
|
WPF Binding: изменение объектов не обрабатывается байднигом
|
|||
|---|---|---|---|
|
#18+
Mode = BindingMode.TwoWay ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 14:24 |
|
||
|
WPF Binding: изменение объектов не обрабатывается байднигом
|
|||
|---|---|---|---|
|
#18+
SeVaMode = BindingMode.TwoWay С конвертором ругается что " : Two-way binding requires Path or XPath." С Path просто как и раньше не срабатывает.. И.. при чем тут TwoWay. я так понимаю что OneWay это от объекта к текстбоксу поэтому вроде и так должно сработать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 15:06 |
|
||
|
WPF Binding: изменение объектов не обрабатывается байднигом
|
|||
|---|---|---|---|
|
#18+
Да, еще забыл tb.DataContext = test2; прописать. Но, если его (DataContext) указать, то когда в для binding прописываеь Path - все отрабатывает нормально, у PropertyChanged есть обработчики. А если через IValueConverter -тогда по прежнему нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:00 |
|
||
|
WPF Binding: изменение объектов не обрабатывается байднигом
|
|||
|---|---|---|---|
|
#18+
McCar попробуй не кодом, а разметкой забиндить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:36 |
|
||
|
WPF Binding: изменение объектов не обрабатывается байднигом
|
|||
|---|---|---|---|
|
#18+
mussonMcCar попробуй не кодом, а разметкой забиндить да там на самом деле более сложный случай который я попытался свести к коротенькому тесту чтобы кто нибудь вразумил меня по поводу механизма байдинга через IValueConverter. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:42 |
|
||
|
WPF Binding: изменение объектов не обрабатывается байднигом
|
|||
|---|---|---|---|
|
#18+
в студии в окне Output можно посмотреть ошибку, если она есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:43 |
|
||
|
WPF Binding: изменение объектов не обрабатывается байднигом
|
|||
|---|---|---|---|
|
#18+
McCarДа, еще забыл tb.DataContext = test2; прописать. Но, если его (DataContext) указать, то когда в для binding прописываеь Path - все отрабатывает нормально, у PropertyChanged есть обработчики. А если через IValueConverter -тогда по прежнему нет. 1. Без указания контекста свойство к чему привязываться будет? Контекст по любому надо указать. 2. Если указан Path="Name", то свойство TextProperty привязывается к интерфейсу INotifyPropertyChanged и ждет сообщений с e.propertyName == "Name". 3. Если Path не указывается, то свойство привязывается к объекту test2... Тяжелый случай То есть, отрабатывать привязка, теоретически, будет при отправке сообщения об изменении test2... А так как объект test2 у вас: а) не меняется, б) ни кто не отправляет сообщений об его изменении, то, соответственно, обновления интерфейса и не происходит. Надеюсь, понятно изложил :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 19:23 |
|
||
|
WPF Binding: изменение объектов не обрабатывается байднигом
|
|||
|---|---|---|---|
|
#18+
Roman S. GolubinMcCarДа, еще забыл tb.DataContext = test2; прописать. Но, если его (DataContext) указать, то когда в для binding прописываеь Path - все отрабатывает нормально, у PropertyChanged есть обработчики. А если через IValueConverter -тогда по прежнему нет. 1. Без указания контекста свойство к чему привязываться будет? Контекст по любому надо указать. 2. Если указан Path="Name", то свойство TextProperty привязывается к интерфейсу INotifyPropertyChanged и ждет сообщений с e.propertyName == "Name". 3. Если Path не указывается, то свойство привязывается к объекту test2... Тяжелый случай То есть, отрабатывать привязка, теоретически, будет при отправке сообщения об изменении test2... А так как объект test2 у вас: а) не меняется, б) ни кто не отправляет сообщений об его изменении, то, соответственно, обновления интерфейса и не происходит. Надеюсь, понятно изложил :) Ну с датаконтекстом это я просто недокопипастил. А насчет остального.. Кажется начинает доходить. Я видимо выдавал желаемое за действительное когда считал что задать Converter это тоже самое что задать Path - но в другой форме. Похоже на то что байдинг не отслеживает никакие изменения объекта до тех пор пока не задашь в явном виде Path. Причем если задать одновременно и то и то ( var b = new Binding { Mode = BindingMode.OneWay, Converter = new TestConverter(), Path = new PropertyPath("Name") }; ) -обработчики события PropertyChanged подключаются, но уже в этих обработичках на изменненное свойство Name накладывается конвертор, которое естесвенно не может скастить string в тестовый класс. Если задать пустой PropertyPath("") - обработчики молча не подключаются, если несущесвующий PropertyPath("aaaa") - тогда в Output окно выводится ошибка байдинга и обработчики не подключаются.. То есть - я так понял, если мы задаем конвертор и не задаем Path, - мы не можем воспользоватсья OneWay или TwoWay байдингом? то есть нет никакого способа заставить байдинг подключать обработчики для PropertyChanged кроме как указав Path? У меня не просто теоретический вопрос, дело в том что в существующем проекте байдинг сделан через IConvertor ы, и сейчас встала задача обновления интерефейса одновременно с изменениями объектов к этому интерфейсу привязанных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2009, 15:31 |
|
||
|
WPF Binding: изменение объектов не обрабатывается байднигом
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Столкнулся с аналогичной проблемой. Поиск решения привел в эту ветку. Roman S. Golubin 1. Без указания контекста свойство к чему привязываться будет? Контекст по любому надо указать. 2. Если указан Path="Name", то свойство TextProperty привязывается к интерфейсу INotifyPropertyChanged и ждет сообщений с e.propertyName == "Name". 3. Если Path не указывается, то свойство привязывается к объекту test2... Тяжелый случай То есть, отрабатывать привязка, теоретически, будет при отправке сообщения об изменении test2... А так как объект test2 у вас: а) не меняется, б) ни кто не отправляет сообщений об его изменении, то, соответственно, обновления интерфейса и не происходит. Надеюсь, понятно изложил :) Да, видимо у нас с автором топика тяжелый случай №3. Данный пост навел на следующую мысль - нужно создать класс-обертку и использовать его экземпляр в качестве DataContext. Код: plaintext 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. Теперь в биндинге можно указать Path Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2010, 23:46 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=21&tid=1442938]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
31ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
| others: | 11ms |
| total: | 120ms |

| 0 / 0 |
