Skip to content
This repository was archived by the owner on Sep 14, 2018. It is now read-only.
This repository was archived by the owner on Sep 14, 2018. It is now read-only.

WPF getter called multiple times #1232

@causa-prima

Description

@causa-prima

(copy of my StackOverFlowQuestion)

I have simple wpf window:

<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, is set as DataContext of the window in 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

, where ViewModel is a C#-implementation of INotifyPropertyChanged.

Now when I open this window, the three TextBoxes have the following Content:

(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

There is one major thing bugging me here: Why is each getter called when only one of them should be called to get the content for a single binding? And why is the getter of each the bound property called twice? That means, why does every getter get called for each property access, and then the actual getter of the wanted property get called again?

What's evene worse: If you delete the second (and even third) TextBox from the xaml, the text in the remaining TextBoxes does not change, meaning getters of properties that are not shown get called!

Can anyone explain what's going here on and how to prevent this behaviour?

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions