BindingExpressionTests.Mode.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using Avalonia.Data;
  2. using Xunit;
  3. #nullable enable
  4. namespace Avalonia.Base.UnitTests.Data.Core;
  5. public partial class BindingExpressionTests
  6. {
  7. [Fact]
  8. public void OneTime_Binding_Sets_Target_Only_Once_If_Data_Context_Does_Not_Change()
  9. {
  10. var data = new ViewModel { Next = new ViewModel { StringValue = "foo" } };
  11. var target = CreateTarget<ViewModel, string?>(x => x.Next!.StringValue, mode: BindingMode.OneTime);
  12. target.DataContext = data;
  13. Assert.Equal("foo", target.String);
  14. data.Next!.StringValue = "bar";
  15. Assert.Equal("foo", target.String);
  16. data.Next = new ViewModel { StringValue = "baz" };
  17. Assert.Equal("foo", target.String);
  18. }
  19. [Fact]
  20. public void OneTime_Binding_With_Simple_Path_Sets_Target_When_Data_Context_Changes()
  21. {
  22. var data1 = new ViewModel { StringValue = "foo" };
  23. var target = CreateTarget<ViewModel, string?>(x => x.StringValue, mode: BindingMode.OneTime);
  24. target.DataContext = data1;
  25. Assert.Equal("foo", target.String);
  26. var data2 = new ViewModel { StringValue = "bar" };
  27. target.DataContext = data2;
  28. Assert.Equal("bar", target.String);
  29. }
  30. [Fact]
  31. public void OneTime_Binding_With_Complex_Path_Sets_Target_When_Data_Context_Changes()
  32. {
  33. var data1 = new ViewModel { Next = new ViewModel { StringValue = "foo" } };
  34. var target = CreateTarget<ViewModel, string?>(x => x.Next!.StringValue, mode: BindingMode.OneTime);
  35. target.DataContext = data1;
  36. Assert.Equal("foo", target.String);
  37. var data2 = new ViewModel { Next = new ViewModel { StringValue = "bar" } };
  38. target.DataContext = data2;
  39. Assert.Equal("bar", target.String);
  40. }
  41. [Fact]
  42. public void OneTime_Binding_Without_Path_Sets_Target_When_Data_Context_Changes()
  43. {
  44. var target = CreateTarget<string, string?>(x => x, mode: BindingMode.OneTime);
  45. target.DataContext = "foo";
  46. Assert.Equal("foo", target.String);
  47. target.DataContext = "bar";
  48. Assert.Equal("bar", target.String);
  49. }
  50. [Fact]
  51. public void OneTime_Binding_Waits_For_DataContext()
  52. {
  53. var target = CreateTarget<ViewModel, string?>(
  54. x => x.StringValue,
  55. mode: BindingMode.OneTime);
  56. Assert.Null(target.String);
  57. }
  58. [Fact]
  59. public void OneTime_Binding_Waits_For_DataContext_With_Matching_Property_Name()
  60. {
  61. var data1 = new { Baz = "baz" };
  62. var data2 = new ViewModel { StringValue = "foo" };
  63. var target = CreateTarget<ViewModel, string?>(
  64. x => x.StringValue,
  65. dataContext: data1,
  66. mode: BindingMode.OneTime);
  67. Assert.Null(target.String);
  68. target.DataContext = data2;
  69. Assert.Equal("foo", target.String);
  70. data2.StringValue = "bar";
  71. Assert.Equal("foo", target.String);
  72. }
  73. [Fact]
  74. public void OneTime_Binding_Waits_For_DataContext_With_Matching_Property_Type()
  75. {
  76. var data1 = new { DoubleValue = new object() };
  77. var data2 = new ViewModel { DoubleValue = 0.5 };
  78. var target = CreateTarget<ViewModel, double>(
  79. x => x.DoubleValue,
  80. dataContext: data1,
  81. mode: BindingMode.OneTime);
  82. Assert.Equal(0, target.Double);
  83. target.DataContext = data2;
  84. Assert.Equal(0.5, target.Double);
  85. data2.DoubleValue = 0.2;
  86. Assert.Equal(0.5, target.Double);
  87. }
  88. [Fact]
  89. public void OneTime_Binding_Waits_For_DataContext_Without_Property_Path()
  90. {
  91. var target = CreateTarget<string?, string?>(
  92. x => x,
  93. mode: BindingMode.OneTime);
  94. target.DataContext = "foo";
  95. Assert.Equal("foo", target.String);
  96. }
  97. [Fact]
  98. public void OneTime_Binding_Waits_For_DataContext_Without_Property_Path_With_StringFormat()
  99. {
  100. var target = CreateTarget<string?, string?>(
  101. x => x,
  102. mode: BindingMode.OneTime,
  103. stringFormat: "bar: {0}");
  104. target.DataContext = "foo";
  105. Assert.Equal("bar: foo", target.String);
  106. }
  107. [Fact]
  108. public void OneWayToSource_Binding_Updates_Source_When_Target_Changes()
  109. {
  110. var data = new ViewModel();
  111. var target = CreateTarget<ViewModel, string?>(
  112. x => x.StringValue,
  113. dataContext: data,
  114. mode: BindingMode.OneWayToSource);
  115. Assert.Null(data.StringValue);
  116. target.String = "foo";
  117. Assert.Equal("foo", data.StringValue);
  118. }
  119. [Fact]
  120. public void OneWayToSource_Binding_Does_Not_Update_Target_When_Source_Changes()
  121. {
  122. var data = new ViewModel();
  123. var target = CreateTarget<ViewModel, string?>(
  124. x => x.StringValue,
  125. dataContext: data,
  126. mode: BindingMode.OneWayToSource);
  127. target.String = "foo";
  128. Assert.Equal("foo", data.StringValue);
  129. data.StringValue = "bar";
  130. Assert.Equal("foo", target.String);
  131. }
  132. [Fact]
  133. public void OneWayToSource_Binding_Updates_Source_When_DataContext_Changes()
  134. {
  135. var data1 = new ViewModel();
  136. var data2 = new ViewModel();
  137. var target = CreateTarget<ViewModel, string?>(
  138. x => x.StringValue,
  139. dataContext: data1,
  140. mode: BindingMode.OneWayToSource);
  141. target.String = "foo";
  142. Assert.Equal("foo", data1.StringValue);
  143. target.DataContext = data2;
  144. Assert.Equal("foo", data2.StringValue);
  145. }
  146. [Fact]
  147. public void Can_Bind_Readonly_Property_OneWayToSource()
  148. {
  149. var data = new ViewModel();
  150. var target = CreateTarget<ViewModel, string?>(
  151. x => x.StringValue,
  152. dataContext: data,
  153. mode: BindingMode.OneWayToSource,
  154. targetProperty: TargetClass.ReadOnlyStringProperty);
  155. Assert.Equal("readonly", data.StringValue);
  156. target.SetReadOnlyString("foo");
  157. Assert.Equal("foo", data.StringValue);
  158. }
  159. }