У меня есть простое окно WPF:WPF геттер вызывается несколько раз
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<StackPanel>
<TextBox AcceptsReturn="True" Text="{Binding A}" /><!-- TextBox1 -->
<TextBox AcceptsReturn="True" Text="{Binding B}" /><!-- TextBox2 -->
<TextBox AcceptsReturn="True" Text="{Binding C}" /><!-- TextBox3 -->
</StackPanel>
</Window>
с ViewModel (IronPython, устанавливается как DataContext окна в CodeBehind):
class TestViewModel(ViewModel):
a_count = 0
b_count = 0
c_count = 0
callStack = ''
@property
def A(self):
self.a_count += 1
self.callStack += 'A getter call {}\n'.format(self.a_count)
return self.callStack
@property
def B(self):
self.b_count += 1
self.callStack += 'B getter call {}\n'.format(self.b_count)
return self.callStack
@property
def C(self):
self.c_count += 1
self.callStack += 'C getter call {}\n'.format(self.c_count)
return self.callStack
, где ViewModel представляет собой C# -выполнение INotifyPropertyChanged
.
Теперь, когда я открываю окно, три TextBox
эс имеют следующее содержание:
(TextBox1)
A getter call 1
B getter call 1
C getter call 1
A getter call 2
(TextBox2)
A getter call 1
B getter call 1
C getter call 1
A getter call 2
A getter call 3
B getter call 2
C getter call 2
B getter call 3
(TextBox3)
A getter call 1
B getter call 1
C getter call 1
A getter call 2
A getter call 3
B getter call 2
C getter call 2
B getter call 3
A getter call 4
B getter call 4
C getter call 3
C getter call 4
Существует одна главная вещь подслушивания мне здесь: Почему каждый геттер вызывается, когда только один из них должен быть привлечен к получить контент для одного связывания? И почему геттер каждого связанного свойства называется дважды? Это означает, почему каждый получатель получает вызов для каждого доступа к ресурсу, а затем снова получает вызов фактического получателя требуемого имущества?
Что еще хуже: если вы удалите второй (и даже третий) TextBox
из xaml, текст в оставшихся TextBox
es не изменится, что означает, что getters свойств, которые не показаны, вызываются!
Может ли кто-нибудь объяснить, что здесь происходит и как предотвратить такое поведение?
Я попробовал «тот же код» на C#, но там все работает так, как ожидалось. –