Skip to content

Commit ac04b32

Browse files
committed
feat: Add ObjectNotNullToVisibilityCollapsedValueConverter and ObjectNullToVisibilityVisibleValueConverter
1 parent 31387ea commit ac04b32

File tree

5 files changed

+125
-0
lines changed

5 files changed

+125
-0
lines changed

src/Atc.Wpf/ValueConverters/@Readme.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,10 @@
4343
| Null -> X | NullCheckValueConverter | NULL -> Parameter if set | Not supported |
4444
| Null -> UnsetValue | NullToUnsetValueConverter | NULL -> DependencyProperty.UnsetValue | Object -> DependencyProperty.UnsetValue |
4545
| Object -> Bool | ObjectNotNullToBoolValueConverter | NotNULL -> True | Not supported |
46+
| Object -> Visibility | ObjectNotNullToVisibilityCollapsedValueConverter | NotNULL -> Collapsed | Not supported |
4647
| Object -> Visibility | ObjectNotNullToVisibilityVisibleValueConverter | NotNULL -> Visible | Not supported |
4748
| Object -> Visibility | ObjectNullToVisibilityCollapsedValueConverter | NULL -> Collapsed | Not supported |
49+
| Object -> Visibility | ObjectNullToVisibilityVisibleValueConverter | NULL -> Visible | Not supported |
4850
| Object[] -> Visibility | MultiObjectNullToVisibilityCollapsedValueConverter | All-NULL -> Collapsed | Not supported |
4951
| Object -> Bool | ObjectNullToBoolValueConverter | NULL => True | Not supported |
5052

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
namespace Atc.Wpf.ValueConverters;
2+
3+
/// <summary>
4+
/// ValueConverter: Object NotNull To Visibility-Collapsed.
5+
/// </summary>
6+
[ValueConversion(typeof(object), typeof(Visibility), ParameterType = typeof(Visibility))]
7+
public sealed class ObjectNotNullToVisibilityCollapsedValueConverter : IValueConverter
8+
{
9+
public Visibility NonVisibility { get; set; } = Visibility.Visible;
10+
11+
/// <inheritdoc />
12+
public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
13+
{
14+
var nonVisibility = NonVisibility;
15+
16+
if (parameter is Visibility visibility and Visibility.Visible)
17+
{
18+
nonVisibility = visibility;
19+
}
20+
21+
return value is null
22+
? nonVisibility
23+
: Visibility.Collapsed;
24+
}
25+
26+
/// <inheritdoc />
27+
public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
28+
{
29+
throw new NotSupportedException("This is a OneWay converter.");
30+
}
31+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
namespace Atc.Wpf.ValueConverters;
2+
3+
/// <summary>
4+
/// ValueConverter: Object Null To Visibility-Visible.
5+
/// </summary>
6+
[ValueConversion(typeof(object), typeof(Visibility))]
7+
public sealed class ObjectNullToVisibilityVisibleValueConverter : IValueConverter
8+
{
9+
/// <inheritdoc />
10+
public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
11+
{
12+
return value is null
13+
? Visibility.Visible
14+
: Visibility.Collapsed;
15+
}
16+
17+
/// <inheritdoc />
18+
public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
19+
{
20+
throw new NotSupportedException("This is a OneWay converter.");
21+
}
22+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
namespace Atc.Wpf.Tests.ValueConverters;
2+
3+
public class ObjectNotNullToVisibilityCollapsedValueConverterTests
4+
{
5+
private readonly IValueConverter converter = new ObjectNotNullToVisibilityCollapsedValueConverter();
6+
7+
[Theory]
8+
[InlineData(Visibility.Visible, null)]
9+
[InlineData(Visibility.Collapsed, true)]
10+
[InlineData(Visibility.Collapsed, "Hello")]
11+
public void Convert(Visibility expected, object? input)
12+
=> Assert.Equal(
13+
expected,
14+
converter.Convert(input, targetType: null, parameter: null, culture: null));
15+
16+
[Theory]
17+
[InlineData(Visibility.Visible, null, null)]
18+
[InlineData(Visibility.Collapsed, true, null)]
19+
[InlineData(Visibility.Collapsed, "Hello", null)]
20+
[InlineData(Visibility.Visible, null, Visibility.Collapsed)]
21+
[InlineData(Visibility.Collapsed, true, Visibility.Collapsed)]
22+
[InlineData(Visibility.Collapsed, "Hello", Visibility.Collapsed)]
23+
[InlineData(Visibility.Visible, null, Visibility.Hidden)]
24+
[InlineData(Visibility.Collapsed, true, Visibility.Hidden)]
25+
[InlineData(Visibility.Collapsed, "Hello", Visibility.Hidden)]
26+
[InlineData(Visibility.Visible, null, Visibility.Visible)]
27+
[InlineData(Visibility.Collapsed, true, Visibility.Visible)]
28+
[InlineData(Visibility.Collapsed, "Hello", Visibility.Visible)]
29+
public void Convert_Parameter(Visibility expected, object? input, object? parameter)
30+
=> Assert.Equal(
31+
expected,
32+
converter.Convert(input, targetType: null, parameter, culture: null));
33+
34+
[Fact]
35+
public void ConvertBack_Should_Throw_Exception()
36+
{
37+
// Act
38+
var exception = Record.Exception(() => converter.ConvertBack(value: null, targetType: null, parameter: null, culture: null));
39+
40+
// Assert
41+
Assert.IsType<NotSupportedException>(exception);
42+
Assert.Equal("This is a OneWay converter.", exception.Message);
43+
}
44+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
namespace Atc.Wpf.Tests.ValueConverters;
2+
3+
public class ObjectNullToVisibilityVisibleValueConverterTests
4+
{
5+
private readonly IValueConverter converter = new ObjectNullToVisibilityVisibleValueConverter();
6+
7+
[Theory]
8+
[InlineData(Visibility.Visible, null)]
9+
[InlineData(Visibility.Collapsed, true)]
10+
[InlineData(Visibility.Collapsed, "Hello")]
11+
public void Convert(Visibility expected, object? input)
12+
=> Assert.Equal(
13+
expected,
14+
converter.Convert(input, targetType: null, parameter: null, culture: null));
15+
16+
[Fact]
17+
public void ConvertBack_Should_Throw_Exception()
18+
{
19+
// Act
20+
var exception = Record.Exception(() => converter.ConvertBack(value: null, targetType: null, parameter: null, culture: null));
21+
22+
// Assert
23+
Assert.IsType<NotSupportedException>(exception);
24+
Assert.Equal("This is a OneWay converter.", exception.Message);
25+
}
26+
}

0 commit comments

Comments
 (0)