Skip to content

Commit 95e3acd

Browse files
author
Sébastien Geiser
committed
Some Corrections and ExpressionEvaluator update
1 parent 849a58f commit 95e3acd

8 files changed

+199
-152
lines changed

CodingSeb.Converters.Examples/TestsPanels/ChainingConverterPanel.xaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<TextBlock Text="{Binding IsChecked,
1313
ElementName=chkChainingConverter,
1414
Mode=OneWay,
15-
Converter={ChainingConverter Converter1={ReverseBoolConverter}, Converter2={BoolToStringConverter TrueValue='TrueValue', FalseValue='FalseValue'} }}"
15+
Converter={ChainingConverter {ReverseBoolConverter}, {BoolToStringConverter TrueValue='TrueValue', FalseValue='FalseValue'}}}"
1616
VerticalAlignment="Center"
1717
Margin="5,0"/>
1818
</Border>

CodingSeb.Converters.Tests/FileNameConverterTests.cs

+10-10
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,16 @@ public void ExecutingAssembly()
7575
converter.Convert("Test", null, null, null).ShouldBe(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Test.png"));
7676
}
7777

78-
[Test]
79-
public void EntryAssembly()
80-
{
81-
FileNameConverter converter = new FileNameConverter()
82-
{
83-
DirectoryPathFrom = DirectoryPath.EntryAssemblyDirectory,
84-
};
85-
86-
converter.Convert("Test", null, null, null).ShouldBe(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Test.png"));
87-
}
78+
//[Test]
79+
//public void EntryAssembly()
80+
//{
81+
// FileNameConverter converter = new FileNameConverter()
82+
// {
83+
// DirectoryPathFrom = DirectoryPath.EntryAssemblyDirectory,
84+
// };
85+
86+
// converter.Convert("Test", null, null, null).ShouldBe(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Test.png"));
87+
//}
8888

8989
[Test]
9090
public void WindowsDirectory()

CodingSeb.Converters.Tests/MappingConverterTests.cs

+37-58
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using NUnit.Framework;
22
using Shouldly;
3-
using System.Collections.ObjectModel;
43
using System.Windows;
54
using System.Windows.Media;
65

@@ -13,22 +12,17 @@ public class MappingConverterTests
1312
[Category("Convert")]
1413
public void MappingConverterTest_StringToString_Convert()
1514
{
16-
MappingConverter converter = new MappingConverter
15+
MappingConverter converter = new MappingConverter();
16+
converter.Mappings.Add(new Mapping()
1717
{
18-
Mappings = new Collection<Mapping>(new Mapping[]
19-
{
20-
new Mapping()
21-
{
22-
Key = "Test 1",
23-
Value = "Yes",
24-
},
25-
new Mapping()
26-
{
27-
Key = "Test 2",
28-
Value = "No",
29-
},
30-
})
31-
};
18+
Key = "Test 1",
19+
Value = "Yes",
20+
});
21+
converter.Mappings.Add(new Mapping()
22+
{
23+
Key = "Test 2",
24+
Value = "No",
25+
});
3226

3327
converter.Convert("Test 1", null, null, null).ShouldBe("Yes");
3428
converter.Convert("Test 2", null, null, null).ShouldBe("No");
@@ -47,22 +41,17 @@ public void MappingConverterTest_StringToString_Convert()
4741
[Category("ConvertBack")]
4842
public void MappingConverterTest_StringToString_ConvertBack()
4943
{
50-
MappingConverter converter = new MappingConverter
44+
MappingConverter converter = new MappingConverter();
45+
converter.Mappings.Add(new Mapping()
5146
{
52-
Mappings = new Collection<Mapping>(new Mapping[]
47+
Key = "Test 1",
48+
Value = "Yes",
49+
});
50+
converter.Mappings.Add(new Mapping()
5351
{
54-
new Mapping()
55-
{
56-
Key = "Test 1",
57-
Value = "Yes",
58-
},
59-
new Mapping()
60-
{
61-
Key = "Test 2",
62-
Value = "No",
63-
},
64-
})
65-
};
52+
Key = "Test 2",
53+
Value = "No",
54+
});
6655

6756
converter.ConvertBack("Yes", null, null, null).ShouldBe("Test 1");
6857
converter.ConvertBack("No", null, null, null).ShouldBe("Test 2");
@@ -81,22 +70,17 @@ public void MappingConverterTest_StringToString_ConvertBack()
8170
[Category("Convert")]
8271
public void MappingConverterTest_ColorToVisibility_Convert()
8372
{
84-
MappingConverter converter = new MappingConverter
73+
MappingConverter converter = new MappingConverter();
74+
converter.Mappings.Add(new Mapping()
8575
{
86-
Mappings = new Collection<Mapping>(new Mapping[]
76+
Key = Colors.Red,
77+
Value = Visibility.Collapsed,
78+
});
79+
converter.Mappings.Add(new Mapping()
8780
{
88-
new Mapping()
89-
{
90-
Key = Colors.Red,
91-
Value = Visibility.Collapsed,
92-
},
93-
new Mapping()
94-
{
95-
Key = Colors.Blue,
96-
Value = Visibility.Visible,
97-
},
98-
})
99-
};
81+
Key = Colors.Blue,
82+
Value = Visibility.Visible,
83+
});
10084

10185
converter.Convert(Colors.Red, null, null, null).ShouldBe(Visibility.Collapsed);
10286
converter.Convert(Colors.Blue, null, null, null).ShouldBe(Visibility.Visible);
@@ -119,22 +103,17 @@ public void MappingConverterTest_ColorToVisibility_Convert()
119103
[Category("ConvertBack")]
120104
public void MappingConverterTest_ColorToVisibility_ConvertBack()
121105
{
122-
MappingConverter converter = new MappingConverter
106+
MappingConverter converter = new MappingConverter();
107+
converter.Mappings.Add(new Mapping()
123108
{
124-
Mappings = new Collection<Mapping>(new Mapping[]
109+
Key = Colors.Red,
110+
Value = Visibility.Collapsed,
111+
});
112+
converter.Mappings.Add(new Mapping()
125113
{
126-
new Mapping()
127-
{
128-
Key = Colors.Red,
129-
Value = Visibility.Collapsed,
130-
},
131-
new Mapping()
132-
{
133-
Key = Colors.Blue,
134-
Value = Visibility.Visible,
135-
},
136-
})
137-
};
114+
Key = Colors.Blue,
115+
Value = Visibility.Visible,
116+
});
138117

139118
converter.ConvertBack(Visibility.Collapsed, null, null, null).ShouldBe(Colors.Red);
140119
converter.ConvertBack(Visibility.Visible, null, null, null).ShouldBe(Colors.Blue);

CodingSeb.Converters/CodingSeb.Converters.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
</PropertyGroup>
1616

1717
<ItemGroup>
18-
<PackageReference Include="CodingSeb.ExpressionEvaluator" Version="1.4.7" />
18+
<PackageReference Include="CodingSeb.ExpressionEvaluator" Version="1.4.16" />
1919
</ItemGroup>
2020

2121
<ItemGroup>
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
2-
using System.Collections.Generic;
2+
using System.Collections.ObjectModel;
33
using System.Globalization;
4+
using System.Linq;
45
using System.Windows;
56
using System.Windows.Data;
67
using System.Windows.Markup;
@@ -16,82 +17,115 @@ namespace CodingSeb.Converters
1617
[ContentWrapper(typeof(IValueConverter))]
1718
public class ChainingConverter : BaseConverter, IValueConverter
1819
{
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+
1955
/// <summary>
2056
/// First Converter to chain (input converter)
2157
/// </summary>
58+
[ConstructorArgument("converter1")]
2259
public IValueConverter Converter1 { get; set; }
2360

2461
/// <summary>
2562
/// Second Converter to chain (output converter)
2663
/// </summary>
64+
[ConstructorArgument("converter2")]
2765
public IValueConverter Converter2 { get; set; }
2866

2967
/// <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
3169
/// </summary>
32-
public List<IValueConverter> Converters { get; } = new List<IValueConverter>();
70+
public Collection<IValueConverter> Converters { get; } = new Collection<IValueConverter>();
3371

3472
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
3573
{
3674
if (value == DependencyProperty.UnsetValue)
37-
{
3875
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)
4185
{
42-
foreach (var converter in Converters)
86+
value = converter.Convert(value, targetType, parameter, culture);
87+
88+
if (value == Binding.DoNothing)
4389
{
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;
5491
}
5592

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+
}
6197
}
98+
99+
return value;
62100
}
63101

64102
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
65103
{
66104
if (value == DependencyProperty.UnsetValue)
67-
{
68105
return value;
69-
}
70-
else if (Converter1 == null || Converter2 == null)
71-
{
72-
List<IValueConverter> convertersReverseList = new List<IValueConverter>(Converters);
73-
convertersReverseList.Reverse();
74106

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)
76118
{
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;
87120
}
88121

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+
}
94126
}
127+
128+
return value;
95129
}
96130
}
97131
}

0 commit comments

Comments
 (0)