CompiledBindingTests_Create.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using System;
  2. using System.Globalization;
  3. using Avalonia.Controls;
  4. using Avalonia.Data;
  5. using Avalonia.Data.Converters;
  6. using Avalonia.UnitTests;
  7. using Xunit;
  8. namespace Avalonia.Base.UnitTests.Data;
  9. public class CompiledBindingTests_Create
  10. {
  11. [Fact]
  12. public void Create_Should_Create_Binding_With_Simple_Property()
  13. {
  14. var binding = CompiledBinding.Create<TestViewModel, string?>(vm => vm.StringProperty);
  15. Assert.NotNull(binding);
  16. Assert.NotNull(binding.Path);
  17. Assert.Equal("StringProperty", binding.Path.ToString());
  18. Assert.Equal(AvaloniaProperty.UnsetValue, binding.Source);
  19. Assert.Equal(BindingMode.Default, binding.Mode);
  20. }
  21. [Fact]
  22. public void Create_Should_Create_Binding_With_Source()
  23. {
  24. var source = new TestViewModel { StringProperty = "Test" };
  25. var binding = CompiledBinding.Create<TestViewModel, string?>(
  26. vm => vm.StringProperty,
  27. source: source);
  28. Assert.NotNull(binding);
  29. Assert.NotNull(binding.Path);
  30. Assert.Equal("StringProperty", binding.Path.ToString());
  31. Assert.Same(source, binding.Source);
  32. }
  33. [Fact]
  34. public void Create_Should_Apply_Converter()
  35. {
  36. var converter = new TestConverter();
  37. var binding = CompiledBinding.Create<TestViewModel, string?>(
  38. vm => vm.StringProperty,
  39. converter: converter);
  40. Assert.Same(converter, binding.Converter);
  41. }
  42. [Fact]
  43. public void Create_Should_Apply_Mode()
  44. {
  45. var binding = CompiledBinding.Create<TestViewModel, string?>(
  46. vm => vm.StringProperty,
  47. mode: BindingMode.TwoWay);
  48. Assert.Equal(BindingMode.TwoWay, binding.Mode);
  49. }
  50. [Fact]
  51. public void Create_Should_Work_With_Nested_Properties()
  52. {
  53. var binding = CompiledBinding.Create<TestViewModel, string?>(
  54. vm => vm.Child!.StringProperty);
  55. Assert.NotNull(binding);
  56. Assert.NotNull(binding.Path);
  57. Assert.Equal("Child.StringProperty", binding.Path.ToString());
  58. }
  59. [Fact]
  60. public void Create_Should_Work_With_Indexer()
  61. {
  62. var binding = CompiledBinding.Create<TestViewModel, string?>(
  63. vm => vm.Items[0]);
  64. Assert.NotNull(binding);
  65. Assert.NotNull(binding.Path);
  66. Assert.Equal("Items[0]", binding.Path.ToString());
  67. }
  68. [Fact]
  69. public void Binding_Should_Work_When_Applied_To_Control()
  70. {
  71. using (UnitTestApplication.Start(TestServices.StyledWindow))
  72. {
  73. var target = new TextBlock();
  74. var viewModel = new TestViewModel { StringProperty = "Hello" };
  75. var binding = CompiledBinding.Create<TestViewModel, string?>(
  76. vm => vm.StringProperty,
  77. source: viewModel);
  78. target.Bind(TextBlock.TextProperty, binding);
  79. Assert.Equal("Hello", target.Text);
  80. }
  81. }
  82. [Fact]
  83. public void Binding_Should_Update_When_Source_Property_Changes()
  84. {
  85. using (UnitTestApplication.Start(TestServices.StyledWindow))
  86. {
  87. var target = new TextBlock();
  88. var viewModel = new TestViewModel { StringProperty = "Initial" };
  89. var binding = CompiledBinding.Create<TestViewModel, string?>(
  90. vm => vm.StringProperty,
  91. source: viewModel);
  92. target.Bind(TextBlock.TextProperty, binding);
  93. Assert.Equal("Initial", target.Text);
  94. viewModel.StringProperty = "Updated";
  95. Assert.Equal("Updated", target.Text);
  96. }
  97. }
  98. [Fact]
  99. public void Binding_Should_Use_DataContext_When_No_Source_Specified()
  100. {
  101. using (UnitTestApplication.Start(TestServices.StyledWindow))
  102. {
  103. var target = new TextBlock();
  104. var viewModel = new TestViewModel { StringProperty = "FromDataContext" };
  105. var binding = CompiledBinding.Create<TestViewModel, string?>(vm => vm.StringProperty);
  106. target.DataContext = viewModel;
  107. target.Bind(TextBlock.TextProperty, binding);
  108. Assert.Equal("FromDataContext", target.Text);
  109. }
  110. }
  111. private class TestViewModel : NotifyingBase
  112. {
  113. private string? _stringProperty;
  114. private TestViewModel? _child;
  115. public string? StringProperty
  116. {
  117. get => _stringProperty;
  118. set { _stringProperty = value; RaisePropertyChanged(); }
  119. }
  120. public TestViewModel? Child
  121. {
  122. get => _child;
  123. set { _child = value; RaisePropertyChanged(); }
  124. }
  125. public string?[] Items { get; set; } = Array.Empty<string?>();
  126. }
  127. private class TestConverter : IValueConverter
  128. {
  129. public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
  130. => value?.ToString()?.ToUpper();
  131. public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
  132. => value?.ToString()?.ToLower();
  133. }
  134. }