Skip to content

Commit b19d824

Browse files
CopilotKeboo
andauthored
Fix AutomationProperties.Name binding errors for HintAssist.Hint (#3946)
* Initial plan * Add ObjectToStringConverter and apply to AutomationProperties.Name bindings Co-authored-by: Keboo <[email protected]> * Add unit tests for ObjectToStringConverter Co-authored-by: Keboo <[email protected]> * Rename ObjectToStringConverter to AutomationPropertiesNameConverter and move to Internal namespace Co-authored-by: Keboo <[email protected]> * Adds internal converters XAML namespace Registers the 'convertersInternal' XML namespace in the DatePicker, NumericUpDown, and TimePicker theme dictionaries. --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: Keboo <[email protected]> Co-authored-by: Kevin Bost <[email protected]>
1 parent 2ba6a98 commit b19d824

9 files changed

+86
-8
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System.Globalization;
2+
using System.Windows.Data;
3+
4+
namespace MaterialDesignThemes.Wpf.Converters.Internal;
5+
6+
public class AutomationPropertiesNameConverter : IValueConverter
7+
{
8+
public static readonly AutomationPropertiesNameConverter Instance = new();
9+
10+
public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
11+
{
12+
if (value is string stringValue)
13+
{
14+
return stringValue;
15+
}
16+
return string.Empty;
17+
}
18+
19+
public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
20+
=> throw new NotImplementedException();
21+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<converters:OutlinedStyleActiveBorderMarginCompensationConverter x:Key="OutlinedStyleActiveBorderMarginCompensationConverter" />
2424
<converters:ElevationRadiusConverter x:Key="ElevationRadiusConverter" Multiplier="-1" />
2525
</Style.Resources>
26-
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}}" />
26+
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}, Converter={x:Static convertersInternal:AutomationPropertiesNameConverter.Instance}}" />
2727
<Setter Property="DropDownBackground" Value="{DynamicResource MaterialDesign.Brush.Card.Background}" />
2828
<Setter Property="DropDownElevation" Value="Dp2" />
2929
<Setter Property="Template">

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@
884884
</ControlTemplate>
885885

886886
<Style x:Key="MaterialDesignComboBox" TargetType="{x:Type ComboBox}">
887-
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}}" />
887+
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}, Converter={x:Static convertersInternal:AutomationPropertiesNameConverter.Instance}}" />
888888
<Setter Property="Background" Value="Transparent" />
889889
<Setter Property="BorderBrush" Value="{DynamicResource MaterialDesign.Brush.ComboBox.Border}" />
890890
<Setter Property="BorderThickness" Value="0,0,0,1" />

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
22
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
33
xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters"
4+
xmlns:convertersInternal="clr-namespace:MaterialDesignThemes.Wpf.Converters.Internal"
45
xmlns:internal="clr-namespace:MaterialDesignThemes.Wpf.Internal"
56
xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf">
67
<ResourceDictionary.MergedDictionaries>
@@ -19,7 +20,7 @@
1920
<Style.Resources>
2021
<Style x:Key="NestedTextBoxStyle" TargetType="{x:Type DatePickerTextBox}" BasedOn="{StaticResource MaterialDesignTextBox}" />
2122
</Style.Resources>
22-
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}}" />
23+
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}, Converter={x:Static convertersInternal:AutomationPropertiesNameConverter.Instance}}" />
2324
<Setter Property="BorderBrush" Value="{DynamicResource MaterialDesign.Brush.ForegroundLight}" />
2425
<Setter Property="BorderThickness" Value="0,0,0,1" />
2526
<Setter Property="CalendarStyle" Value="{StaticResource MaterialDesignDatePickerCalendarPortrait}" />

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
22
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
33
xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters"
4+
xmlns:convertersInternal="clr-namespace:MaterialDesignThemes.Wpf.Converters.Internal"
45
xmlns:internal="clr-namespace:MaterialDesignThemes.Wpf.Internal"
56
xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf">
67
<ResourceDictionary.MergedDictionaries>
@@ -33,7 +34,7 @@
3334
TargetType="{x:Type ButtonBase}"
3435
BasedOn="{StaticResource MaterialDesignNumericUpDownButtonsStyle}" />
3536
</Style.Resources>
36-
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}}" />
37+
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}, Converter={x:Static convertersInternal:AutomationPropertiesNameConverter.Instance}}" />
3738
<Setter Property="BorderBrush" Value="{DynamicResource MaterialDesign.Brush.ForegroundLight}" />
3839
<Setter Property="BorderThickness" Value="0,0,0,1" />
3940
<Setter Property="DecreaseContent" Value="{StaticResource ContentDecrease}" />

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
</Style>
5252
</Style.Resources>
5353
<Setter Property="AllowDrop" Value="true" />
54-
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}}" />
54+
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}, Converter={x:Static convertersInternal:AutomationPropertiesNameConverter.Instance}}" />
5555
<Setter Property="Background" Value="Transparent" />
5656
<Setter Property="BorderBrush" Value="{DynamicResource MaterialDesign.Brush.ForegroundLight}" />
5757
<Setter Property="BorderThickness" Value="0,0,0,1" />
@@ -609,7 +609,7 @@
609609
</Style>
610610
</Style.Resources>
611611
<Setter Property="AllowDrop" Value="true" />
612-
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}}" />
612+
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}, Converter={x:Static convertersInternal:AutomationPropertiesNameConverter.Instance}}" />
613613
<Setter Property="Background" Value="Transparent" />
614614
<Setter Property="BorderBrush" Value="{DynamicResource MaterialDesign.Brush.ForegroundLight}" />
615615
<Setter Property="BorderThickness" Value="0,0,0,1" />

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
<convertersInternal:TextBoxHorizontalScrollBarWidthConverter x:Key="TextBoxHorizontalScrollBarWidthConverter" />
5454
</Style.Resources>
5555

56-
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}}" />
56+
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}, Converter={x:Static convertersInternal:AutomationPropertiesNameConverter.Instance}}" />
5757
<Setter Property="AllowDrop" Value="true" />
5858
<Setter Property="Background" Value="Transparent" />
5959
<Setter Property="BorderBrush" Value="{DynamicResource MaterialDesign.Brush.TextBox.Border}" />

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
22
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
33
xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters"
4+
xmlns:convertersInternal="clr-namespace:MaterialDesignThemes.Wpf.Converters.Internal"
45
xmlns:internal="clr-namespace:MaterialDesignThemes.Wpf.Internal"
56
xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf">
67
<ResourceDictionary.MergedDictionaries>
@@ -11,7 +12,7 @@
1112
<Style.Resources>
1213
<Style x:Key="NestedTextBoxStyle" TargetType="wpf:TimePickerTextBox" BasedOn="{StaticResource MaterialDesignTextBox}" />
1314
</Style.Resources>
14-
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}}" />
15+
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}, Converter={x:Static convertersInternal:AutomationPropertiesNameConverter.Instance}}" />
1516
<Setter Property="BorderBrush" Value="{DynamicResource MaterialDesign.Brush.ForegroundLight}" />
1617
<Setter Property="BorderThickness" Value="0,0,0,1" />
1718
<Setter Property="ClockHostContentControlStyle">
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System.Globalization;
2+
using MaterialDesignThemes.Wpf.Converters.Internal;
3+
using TUnit.Core;
4+
using TUnit.Assertions;
5+
using TUnit.Assertions.Extensions;
6+
using System.Threading.Tasks;
7+
8+
namespace MaterialDesignThemes.Wpf.Tests.Converters;
9+
10+
public sealed class AutomationPropertiesNameConverterTests
11+
{
12+
[Test]
13+
public async Task Convert_StringValue_ReturnsOriginalString()
14+
{
15+
var converter = AutomationPropertiesNameConverter.Instance;
16+
string input = "Test String";
17+
18+
var result = converter.Convert(input, typeof(string), null, CultureInfo.InvariantCulture);
19+
20+
await Assert.That(result).IsEqualTo(input);
21+
}
22+
23+
[Test]
24+
public async Task Convert_NullValue_ReturnsEmptyString()
25+
{
26+
var converter = AutomationPropertiesNameConverter.Instance;
27+
28+
var result = converter.Convert(null, typeof(string), null, CultureInfo.InvariantCulture);
29+
30+
await Assert.That(result).IsEqualTo(string.Empty);
31+
}
32+
33+
[Test]
34+
public async Task Convert_NonStringValue_ReturnsEmptyString()
35+
{
36+
var converter = AutomationPropertiesNameConverter.Instance;
37+
int input = 42;
38+
39+
var result = converter.Convert(input, typeof(string), null, CultureInfo.InvariantCulture);
40+
41+
await Assert.That(result).IsEqualTo(string.Empty);
42+
}
43+
44+
[Test]
45+
public async Task Convert_EmptyString_ReturnsEmptyString()
46+
{
47+
var converter = AutomationPropertiesNameConverter.Instance;
48+
string input = string.Empty;
49+
50+
var result = converter.Convert(input, typeof(string), null, CultureInfo.InvariantCulture);
51+
52+
await Assert.That(result).IsEqualTo(string.Empty);
53+
}
54+
}

0 commit comments

Comments
 (0)