多次调用WPF getter

时间:2015-10-07 09:41:24

标签: wpf xaml ironpython getter

我有简单的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没有显示被叫!

任何人都可以解释这里的内容以及如何防止这种行为吗?

2 个答案:

答案 0 :(得分:0)

Getters应该不会破坏对象的状态。基于这些假设,各种服务随时可以调用它们。考虑例如当窗口需要重绘时。

答案 1 :(得分:0)

我可以想象,由于dlr,吸气剂经常被调用。 WPF通常也使用getter进行类型检测。如果在编译时不知道类型,则只能像这样解析它。