Skip to content

Commit 572eccc

Browse files
Use more direct bindings instead of traversing the visual tree (#3595)
1 parent eb41544 commit 572eccc

File tree

3 files changed

+33
-24
lines changed

3 files changed

+33
-24
lines changed

src/MaterialDesignThemes.Wpf/RatingBar.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ private void RebuildButtons()
324324
{
325325
for (int i = Max; i >= start; i--)
326326
{
327-
var ratingBarButton = new RatingBarButton
327+
var ratingBarButton = new RatingBarButton(this)
328328
{
329329
Content = i,
330330
ContentTemplate = ValueItemTemplate,
@@ -340,7 +340,7 @@ private void RebuildButtons()
340340
{
341341
for (int i = start; i <= Max; i++)
342342
{
343-
var ratingBarButton = new RatingBarButton
343+
var ratingBarButton = new RatingBarButton(this)
344344
{
345345
Content = i,
346346
ContentTemplate = ValueItemTemplate,

src/MaterialDesignThemes.Wpf/RatingBarButton.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,13 @@ public int Value
2020
get => (int)GetValue(ValueProperty);
2121
internal set => SetValue(ValuePropertyKey, value);
2222
}
23+
24+
public RatingBar RatingBar { get; } = null!; // Null initializer added to suppress warning (for the obsoleted empty constructor)
25+
26+
public RatingBarButton(RatingBar ratingBar) => RatingBar = ratingBar;
27+
28+
// Only added the default constructor for back-compat. Ideally should not be used from MDIX consumers, but you never know.
29+
[Obsolete("Should not be used. Use the constructor taking a RatingBar instance as parameter instead. This constructor will be removed in a future version.")]
30+
public RatingBarButton()
31+
{ }
2332
}

src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.RatingBar.xaml

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@
4848
<TextBlock.Foreground>
4949
<MultiBinding Converter="{x:Static wpf:RatingBar+TextBlockForegroundConverter.Instance}">
5050
<Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
51-
<Binding Path="Orientation" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
52-
<Binding Path="InvertDirection" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
53-
<Binding Path="Value" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
51+
<Binding Path="RatingBar.Orientation" RelativeSource="{RelativeSource TemplatedParent}" />
52+
<Binding Path="RatingBar.InvertDirection" RelativeSource="{RelativeSource TemplatedParent}" />
53+
<Binding Path="RatingBar.Value" RelativeSource="{RelativeSource TemplatedParent}" />
5454
<Binding Path="Value" RelativeSource="{RelativeSource TemplatedParent}" />
5555
</MultiBinding>
5656
</TextBlock.Foreground>
@@ -70,10 +70,10 @@
7070
<MultiBinding Converter="{x:Static wpf:RatingBar+PreviewIndicatorTransformXConverter.Instance}">
7171
<Binding Path="ActualWidth" RelativeSource="{RelativeSource TemplatedParent}" />
7272
<Binding ElementName="previewValueHorizontal" Path="ActualWidth" />
73-
<Binding Path="Orientation" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
74-
<Binding Path="InvertDirection" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
75-
<Binding Path="IsFractionalValueEnabled" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
76-
<Binding Path="PreviewValue" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
73+
<Binding Path="RatingBar.Orientation" RelativeSource="{RelativeSource TemplatedParent}" />
74+
<Binding Path="RatingBar.InvertDirection" RelativeSource="{RelativeSource TemplatedParent}" />
75+
<Binding Path="RatingBar.IsFractionalValueEnabled" RelativeSource="{RelativeSource TemplatedParent}" />
76+
<Binding Path="RatingBar.PreviewValue" RelativeSource="{RelativeSource TemplatedParent}" />
7777
<Binding Path="Value" RelativeSource="{RelativeSource TemplatedParent}" />
7878
<Binding Path="IsMouseOver" RelativeSource="{RelativeSource TemplatedParent}" />
7979
</MultiBinding>
@@ -82,10 +82,10 @@
8282
<MultiBinding Converter="{x:Static wpf:RatingBar+PreviewIndicatorTransformYConverter.Instance}">
8383
<Binding Path="ActualHeight" RelativeSource="{RelativeSource TemplatedParent}" />
8484
<Binding ElementName="previewValueHorizontal" Path="ActualHeight" />
85-
<Binding Path="Orientation" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
86-
<Binding Path="InvertDirection" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
87-
<Binding Path="IsFractionalValueEnabled" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
88-
<Binding Path="PreviewValue" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
85+
<Binding Path="RatingBar.Orientation" RelativeSource="{RelativeSource TemplatedParent}" />
86+
<Binding Path="RatingBar.InvertDirection" RelativeSource="{RelativeSource TemplatedParent}" />
87+
<Binding Path="RatingBar.IsFractionalValueEnabled" RelativeSource="{RelativeSource TemplatedParent}" />
88+
<Binding Path="RatingBar.PreviewValue" RelativeSource="{RelativeSource TemplatedParent}" />
8989
<Binding Path="Value" RelativeSource="{RelativeSource TemplatedParent}" />
9090
<Binding Path="IsMouseOver" RelativeSource="{RelativeSource TemplatedParent}" />
9191
</MultiBinding>
@@ -123,10 +123,10 @@
123123
<MultiBinding Converter="{x:Static wpf:RatingBar+PreviewIndicatorTransformXConverter.Instance}">
124124
<Binding Path="ActualWidth" RelativeSource="{RelativeSource TemplatedParent}" />
125125
<Binding ElementName="previewValueVertical" Path="ActualWidth" />
126-
<Binding Path="Orientation" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
127-
<Binding Path="InvertDirection" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
128-
<Binding Path="IsFractionalValueEnabled" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
129-
<Binding Path="PreviewValue" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
126+
<Binding Path="RatingBar.Orientation" RelativeSource="{RelativeSource TemplatedParent}" />
127+
<Binding Path="RatingBar.InvertDirection" RelativeSource="{RelativeSource TemplatedParent}" />
128+
<Binding Path="RatingBar.IsFractionalValueEnabled" RelativeSource="{RelativeSource TemplatedParent}" />
129+
<Binding Path="RatingBar.PreviewValue" RelativeSource="{RelativeSource TemplatedParent}" />
130130
<Binding Path="Value" RelativeSource="{RelativeSource TemplatedParent}" />
131131
<Binding Path="IsMouseOver" RelativeSource="{RelativeSource TemplatedParent}" />
132132
</MultiBinding>
@@ -135,10 +135,10 @@
135135
<MultiBinding Converter="{x:Static wpf:RatingBar+PreviewIndicatorTransformYConverter.Instance}">
136136
<Binding Path="ActualHeight" RelativeSource="{RelativeSource TemplatedParent}" />
137137
<Binding ElementName="previewValueVertical" Path="ActualHeight" />
138-
<Binding Path="Orientation" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
139-
<Binding Path="InvertDirection" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
140-
<Binding Path="IsFractionalValueEnabled" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
141-
<Binding Path="PreviewValue" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
138+
<Binding Path="RatingBar.Orientation" RelativeSource="{RelativeSource TemplatedParent}" />
139+
<Binding Path="RatingBar.InvertDirection" RelativeSource="{RelativeSource TemplatedParent}" />
140+
<Binding Path="RatingBar.IsFractionalValueEnabled" RelativeSource="{RelativeSource TemplatedParent}" />
141+
<Binding Path="RatingBar.PreviewValue" RelativeSource="{RelativeSource TemplatedParent}" />
142142
<Binding Path="Value" RelativeSource="{RelativeSource TemplatedParent}" />
143143
<Binding Path="IsMouseOver" RelativeSource="{RelativeSource TemplatedParent}" />
144144
</MultiBinding>
@@ -243,9 +243,9 @@
243243
<TextBlock.Foreground>
244244
<MultiBinding Converter="{x:Static wpf:RatingBar+TextBlockForegroundConverter.Instance}">
245245
<Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
246-
<Binding Path="Orientation" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
247-
<Binding Path="InvertDirection" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
248-
<Binding Path="Value" RelativeSource="{RelativeSource FindAncestor, AncestorType=wpf:RatingBar}" />
246+
<Binding Path="RatingBar.Orientation" RelativeSource="{RelativeSource TemplatedParent}" />
247+
<Binding Path="RatingBar.InvertDirection" RelativeSource="{RelativeSource TemplatedParent}" />
248+
<Binding Path="RatingBar.Value" RelativeSource="{RelativeSource TemplatedParent}" />
249249
<Binding Path="Value" RelativeSource="{RelativeSource TemplatedParent}" />
250250
</MultiBinding>
251251
</TextBlock.Foreground>

0 commit comments

Comments
 (0)