2015-10-07 2 views
1

У меня есть простое окно 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 свойств, которые не показаны, вызываются!

Может ли кто-нибудь объяснить, что здесь происходит и как предотвратить такое поведение?

ответ

0

Предполагается, что геттеры не могут изменять состояние объекта. Исходя из этих предположений, различные службы не стесняются их называть. Рассмотрим, например, когда окно нужно перерисовать.

+1

Я попробовал «тот же код» на C#, но там все работает так, как ожидалось. –

0

Я мог бы представить, что геттеры называются так часто из-за dlr. WPF обычно использует геттеры также для обнаружения типов. Если тип не известен во время компиляции, он может быть разрешен только таким образом.