@@ -73,32 +73,74 @@ protected override DependencyObject GetContainerForItemOverride()
73
73
74
74
protected override void PrepareContainerForItemOverride ( DependencyObject element , object item )
75
75
{
76
- base . PrepareContainerForItemOverride ( element , item ) ;
76
+ if ( IsUsingOwnContainerAsTemplateRoot && element is ContentPresenter cp )
77
+ {
78
+ // ItemsControl::PrepareContainerForItemOverride will apply the ItemContainerStyle to the element which is not something we want here,
79
+ // since it can throw: The DP [WrongDP] is owned by [Control] and cannot be used on [ContentPresenter].
80
+ // While this doesnt break the control or the visual, it can cause a scaling performance degradation.
81
+
82
+ cp . ContentTemplate = ItemTemplate ;
83
+ cp . ContentTemplateSelector = ItemTemplateSelector ;
84
+
85
+ cp . DataContext = item ;
86
+ SetContent ( cp , item ) ;
77
87
78
- void SetupTabBarItem ( TabBarItem item )
88
+ if ( cp . ContentTemplateRoot is TabBarItem tbi )
89
+ {
90
+ ApplyContainerStyle ( tbi ) ;
91
+ SetupTabBarItem ( tbi ) ;
92
+ }
93
+ }
94
+ else
79
95
{
80
- item . IsSelected = IsSelected ( IndexFromContainer ( element ) ) ;
81
- item . Click += OnTabBarItemClick ;
82
- item . IsSelectedChanged += OnTabBarIsSelectedChanged ;
96
+ base . PrepareContainerForItemOverride ( element , item ) ;
97
+ if ( element is TabBarItem tbi )
98
+ {
99
+ SetupTabBarItem ( tbi ) ;
100
+ }
83
101
}
84
102
85
- if ( element is TabBarItem container )
103
+ void SetContent ( ContentPresenter cp , object item )
86
104
{
87
- SetupTabBarItem ( container ) ;
105
+ if ( string . IsNullOrEmpty ( DisplayMemberPath ) )
106
+ {
107
+ cp . Content = item ;
108
+ }
109
+ else
110
+ {
111
+ cp . SetBinding ( ContentPresenter . ContentProperty , new Binding
112
+ {
113
+ Source = item ,
114
+ Path = DisplayMemberPath ,
115
+ } ) ;
116
+ }
88
117
}
89
- else if ( IsUsingOwnContainerAsTemplateRoot &&
90
- element is ContentPresenter outerContainer )
118
+ void ApplyContainerStyle ( TabBarItem tbi )
91
119
{
92
- var templateRoot = outerContainer . ContentTemplate . LoadContent ( ) ;
93
- if ( templateRoot is TabBarItem tabBarItem )
120
+ var localStyleValue = tbi . ReadLocalValue ( FrameworkElement . StyleProperty ) ;
121
+ var isStyleSetFromTabBar = tbi . IsStyleSetFromTabBar ;
122
+
123
+ if ( localStyleValue == DependencyProperty . UnsetValue || isStyleSetFromTabBar )
94
124
{
95
- outerContainer . ContentTemplate = null ;
96
- SetupTabBarItem ( tabBarItem ) ;
97
- tabBarItem . DataContext = item ;
98
- tabBarItem . Style ??= ItemContainerStyle ;
99
- outerContainer . Content = tabBarItem ;
125
+ var style = ItemContainerStyle ?? ItemContainerStyleSelector ? . SelectStyle ( item , tbi ) ;
126
+ if ( style is { } )
127
+ {
128
+ tbi . Style = style ;
129
+ tbi . IsStyleSetFromTabBar = true ;
130
+ }
131
+ else
132
+ {
133
+ tbi . ClearValue ( FrameworkElement . StyleProperty ) ;
134
+ tbi . IsStyleSetFromTabBar = false ;
135
+ }
100
136
}
101
137
}
138
+ void SetupTabBarItem ( TabBarItem tbi )
139
+ {
140
+ tbi . IsSelected = IsSelected ( IndexFromContainer ( element ) ) ;
141
+ tbi . Click += OnTabBarItemClick ;
142
+ tbi . IsSelectedChanged += OnTabBarIsSelectedChanged ;
143
+ }
102
144
}
103
145
104
146
internal virtual bool IsSelected ( int index )
@@ -108,30 +150,26 @@ internal virtual bool IsSelected(int index)
108
150
109
151
protected override void ClearContainerForItemOverride ( DependencyObject element , object item )
110
152
{
111
- base . ClearContainerForItemOverride ( element , item ) ;
112
-
113
- void TearDownTabBarItem ( TabBarItem item )
153
+ if ( IsUsingOwnContainerAsTemplateRoot && element is ContentPresenter cp )
114
154
{
115
- item . Click -= OnTabBarItemClick ;
116
- item . IsSelectedChanged -= OnTabBarIsSelectedChanged ;
117
- if ( ! IsUsingOwnContainerAsTemplateRoot )
155
+ if ( cp . ContentTemplateRoot is TabBarItem tbi )
118
156
{
119
- item . Style = null ;
157
+ TearDownTabBarItem ( tbi ) ;
120
158
}
121
159
}
122
- if ( element is TabBarItem container )
160
+ else
123
161
{
124
- TearDownTabBarItem ( container ) ;
125
- }
126
- else if ( IsUsingOwnContainerAsTemplateRoot &&
127
- element is ContentPresenter outerContainer )
128
- {
129
- if ( outerContainer . Content is TabBarItem innerContainer )
162
+ base . ClearContainerForItemOverride ( element , item ) ;
163
+ if ( element is TabBarItem tbi )
130
164
{
131
- TearDownTabBarItem ( innerContainer ) ;
132
- innerContainer . DataContext = null ;
165
+ TearDownTabBarItem ( tbi ) ;
133
166
}
134
- outerContainer . Content = null ;
167
+ }
168
+
169
+ void TearDownTabBarItem ( TabBarItem item )
170
+ {
171
+ item . Click -= OnTabBarItemClick ;
172
+ item . IsSelectedChanged -= OnTabBarIsSelectedChanged ;
135
173
}
136
174
}
137
175
0 commit comments