我有简单的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>
with viewmodel(IronPython,设置为CodeBehind窗口的DataContext):
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是INotifyPropertyChanged
的C#实现。
现在,当我打开此窗口时,三个TextBox
es具有以下内容:
(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
在这里有一个主要的问题:为什么每次调用时只调用其中一个来获取单个绑定的内容?为什么每个绑定属性的getter被调用两次?这意味着,为什么每个属性访问都会调用每个getter,然后再次调用所需属性的实际getter?
更糟糕的是:如果从xaml中删除第二个(甚至第三个)TextBox
,则剩余的TextBox
es中的文本不会更改,这意味着属性的getter没有显示被叫!
任何人都可以解释这里的内容以及如何防止这种行为吗?
答案 0 :(得分:0)
Getters应该不会破坏对象的状态。基于这些假设,各种服务随时可以调用它们。考虑例如当窗口需要重绘时。
答案 1 :(得分:0)
我可以想象,由于dlr,吸气剂经常被调用。 WPF通常也使用getter进行类型检测。如果在编译时不知道类型,则只能像这样解析它。