1
1
using System ;
2
- using System . Collections . Generic ;
2
+ using System . Collections . ObjectModel ;
3
3
using System . Globalization ;
4
+ using System . Linq ;
4
5
using System . Windows ;
5
6
using System . Windows . Data ;
6
7
using System . Windows . Markup ;
@@ -16,82 +17,115 @@ namespace CodingSeb.Converters
16
17
[ ContentWrapper ( typeof ( IValueConverter ) ) ]
17
18
public class ChainingConverter : BaseConverter , IValueConverter
18
19
{
20
+ #region Constructors
21
+
22
+ public ChainingConverter ( )
23
+ { }
24
+
25
+ public ChainingConverter ( IValueConverter converter1 ) => Converter1 = converter1 ;
26
+
27
+ public ChainingConverter ( IValueConverter converter1 , IValueConverter converter2 ) : this ( converter1 ) => Converter2 = converter2 ;
28
+
29
+ public ChainingConverter ( IValueConverter converter1 , IValueConverter converter2 , IValueConverter converter3 ) : this ( converter1 , converter2 )
30
+ => Converters . Add ( converter3 ) ;
31
+
32
+ public ChainingConverter ( IValueConverter converter1 , IValueConverter converter2 , IValueConverter converter3 , IValueConverter converter4 )
33
+ : this ( converter1 , converter2 , converter3 ) => Converters . Add ( converter4 ) ;
34
+
35
+ public ChainingConverter ( IValueConverter converter1 , IValueConverter converter2 , IValueConverter converter3 , IValueConverter converter4 , IValueConverter converter5 )
36
+ : this ( converter1 , converter2 , converter3 , converter4 ) => Converters . Add ( converter5 ) ;
37
+
38
+ public ChainingConverter ( IValueConverter converter1 , IValueConverter converter2 , IValueConverter converter3 , IValueConverter converter4 , IValueConverter converter5 , IValueConverter converter6 )
39
+ : this ( converter1 , converter2 , converter3 , converter4 , converter5 ) => Converters . Add ( converter6 ) ;
40
+
41
+ public ChainingConverter ( IValueConverter converter1 , IValueConverter converter2 , IValueConverter converter3 , IValueConverter converter4 , IValueConverter converter5 , IValueConverter converter6 , IValueConverter converter7 )
42
+ : this ( converter1 , converter2 , converter3 , converter4 , converter5 , converter6 ) => Converters . Add ( converter7 ) ;
43
+
44
+ public ChainingConverter ( IValueConverter converter1 , IValueConverter converter2 , IValueConverter converter3 , IValueConverter converter4 , IValueConverter converter5 , IValueConverter converter6 , IValueConverter converter7 , IValueConverter converter8 )
45
+ : this ( converter1 , converter2 , converter3 , converter4 , converter5 , converter6 , converter7 ) => Converters . Add ( converter8 ) ;
46
+
47
+ public ChainingConverter ( IValueConverter converter1 , IValueConverter converter2 , IValueConverter converter3 , IValueConverter converter4 , IValueConverter converter5 , IValueConverter converter6 , IValueConverter converter7 , IValueConverter converter8 , IValueConverter converter9 )
48
+ : this ( converter1 , converter2 , converter3 , converter4 , converter5 , converter6 , converter7 , converter8 ) => Converters . Add ( converter9 ) ;
49
+
50
+ public ChainingConverter ( IValueConverter converter1 , IValueConverter converter2 , IValueConverter converter3 , IValueConverter converter4 , IValueConverter converter5 , IValueConverter converter6 , IValueConverter converter7 , IValueConverter converter8 , IValueConverter converter9 , IValueConverter converter10 )
51
+ : this ( converter1 , converter2 , converter3 , converter4 , converter5 , converter6 , converter7 , converter8 , converter9 ) => Converters . Add ( converter10 ) ;
52
+
53
+ #endregion
54
+
19
55
/// <summary>
20
56
/// First Converter to chain (input converter)
21
57
/// </summary>
58
+ [ ConstructorArgument ( "converter1" ) ]
22
59
public IValueConverter Converter1 { get ; set ; }
23
60
24
61
/// <summary>
25
62
/// Second Converter to chain (output converter)
26
63
/// </summary>
64
+ [ ConstructorArgument ( "converter2" ) ]
27
65
public IValueConverter Converter2 { get ; set ; }
28
66
29
67
/// <summary>
30
- /// For a list of converters to chain (Use as content Property, Converter1 and Converter2 must be null)
68
+ /// To use more than 2 converters
31
69
/// </summary>
32
- public List < IValueConverter > Converters { get ; } = new List < IValueConverter > ( ) ;
70
+ public Collection < IValueConverter > Converters { get ; } = new Collection < IValueConverter > ( ) ;
33
71
34
72
public object Convert ( object value , Type targetType , object parameter , CultureInfo culture )
35
73
{
36
74
if ( value == DependencyProperty . UnsetValue )
37
- {
38
75
return value ;
39
- }
40
- else if ( Converter1 == null || Converter2 == null )
76
+
77
+ var converters = Converters . ToList ( ) ;
78
+
79
+ if ( Converter2 != null )
80
+ converters . Insert ( 0 , Converter2 ) ;
81
+ if ( Converter1 != null )
82
+ converters . Insert ( 0 , Converter1 ) ;
83
+
84
+ foreach ( var converter in converters )
41
85
{
42
- foreach ( var converter in Converters )
86
+ value = converter . Convert ( value , targetType , parameter , culture ) ;
87
+
88
+ if ( value == Binding . DoNothing )
43
89
{
44
- value = converter . Convert ( value , targetType , parameter , culture ) ;
45
- if ( value == Binding . DoNothing )
46
- {
47
- return Binding . DoNothing ;
48
- }
49
-
50
- if ( value == DependencyProperty . UnsetValue )
51
- {
52
- return DependencyProperty . UnsetValue ;
53
- }
90
+ return Binding . DoNothing ;
54
91
}
55
92
56
- return value ;
57
- }
58
- else
59
- {
60
- return Converter2 . Convert ( Converter1 . Convert ( value , targetType , parameter , culture ) , targetType , parameter , culture ) ;
93
+ if ( value == DependencyProperty . UnsetValue )
94
+ {
95
+ return DependencyProperty . UnsetValue ;
96
+ }
61
97
}
98
+
99
+ return value ;
62
100
}
63
101
64
102
public object ConvertBack ( object value , Type targetType , object parameter , CultureInfo culture )
65
103
{
66
104
if ( value == DependencyProperty . UnsetValue )
67
- {
68
105
return value ;
69
- }
70
- else if ( Converter1 == null || Converter2 == null )
71
- {
72
- List < IValueConverter > convertersReverseList = new List < IValueConverter > ( Converters ) ;
73
- convertersReverseList . Reverse ( ) ;
74
106
75
- foreach ( var converter in convertersReverseList )
107
+ var converters = Converters . ToList ( ) ;
108
+
109
+ if ( Converter2 != null )
110
+ converters . Insert ( 0 , Converter2 ) ;
111
+ if ( Converter1 != null )
112
+ converters . Insert ( 0 , Converter1 ) ;
113
+
114
+ foreach ( var converter in Enumerable . Reverse ( converters ) )
115
+ {
116
+ value = converter . ConvertBack ( value , targetType , parameter , culture ) ;
117
+ if ( value == Binding . DoNothing )
76
118
{
77
- value = converter . ConvertBack ( value , targetType , parameter , culture ) ;
78
- if ( value == Binding . DoNothing )
79
- {
80
- return Binding . DoNothing ;
81
- }
82
-
83
- if ( value == DependencyProperty . UnsetValue )
84
- {
85
- return DependencyProperty . UnsetValue ;
86
- }
119
+ return Binding . DoNothing ;
87
120
}
88
121
89
- return value ;
90
- }
91
- else
92
- {
93
- return Converter1 . ConvertBack ( Converter2 . ConvertBack ( value , targetType , parameter , culture ) , targetType , parameter , culture ) ;
122
+ if ( value == DependencyProperty . UnsetValue )
123
+ {
124
+ return DependencyProperty . UnsetValue ;
125
+ }
94
126
}
127
+
128
+ return value ;
95
129
}
96
130
}
97
131
}
0 commit comments