BindingTests_RelativeSource.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // Copyright (c) The Avalonia Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using Avalonia.Controls;
  4. using Avalonia.UnitTests;
  5. using Xunit;
  6. namespace Avalonia.Markup.Xaml.UnitTests.Xaml
  7. {
  8. public class BindingTests_RelativeSource
  9. {
  10. [Fact]
  11. public void Binding_To_DataContext_Works()
  12. {
  13. using (UnitTestApplication.Start(TestServices.StyledWindow))
  14. {
  15. var xaml = @"
  16. <Window xmlns='https://github.com/avaloniaui'
  17. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  18. xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
  19. <Button Name='button' Content='{Binding Foo, RelativeSource={RelativeSource DataContext}}'/>
  20. </Window>";
  21. var loader = new AvaloniaXamlLoader();
  22. var window = (Window)loader.Load(xaml);
  23. var button = window.FindControl<Button>("button");
  24. button.DataContext = new { Foo = "foo" };
  25. window.ApplyTemplate();
  26. Assert.Equal("foo", button.Content);
  27. }
  28. }
  29. [Fact]
  30. public void Binding_To_Self_Works()
  31. {
  32. using (UnitTestApplication.Start(TestServices.StyledWindow))
  33. {
  34. var xaml = @"
  35. <Window xmlns='https://github.com/avaloniaui'
  36. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  37. xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
  38. <Button Name='button' Content='{Binding Name, RelativeSource={RelativeSource Self}}'/>
  39. </Window>";
  40. var loader = new AvaloniaXamlLoader();
  41. var window = (Window)loader.Load(xaml);
  42. var button = window.FindControl<Button>("button");
  43. window.ApplyTemplate();
  44. Assert.Equal("button", button.Content);
  45. }
  46. }
  47. [Fact]
  48. public void Binding_To_First_Ancestor_Works()
  49. {
  50. using (UnitTestApplication.Start(TestServices.StyledWindow))
  51. {
  52. var xaml = @"
  53. <Window xmlns='https://github.com/avaloniaui'
  54. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  55. xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
  56. <Border Name='border1'>
  57. <Border Name='border2'>
  58. <Button Name='button' Content='{Binding Name, RelativeSource={RelativeSource AncestorType=Border}}'/>
  59. </Border>
  60. </Border>
  61. </Window>";
  62. var loader = new AvaloniaXamlLoader();
  63. var window = (Window)loader.Load(xaml);
  64. var button = window.FindControl<Button>("button");
  65. window.ApplyTemplate();
  66. Assert.Equal("border2", button.Content);
  67. }
  68. }
  69. [Fact]
  70. public void Binding_To_Second_Ancestor_Works()
  71. {
  72. using (UnitTestApplication.Start(TestServices.StyledWindow))
  73. {
  74. var xaml = @"
  75. <Window xmlns='https://github.com/avaloniaui'
  76. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  77. xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
  78. <Border Name='border1'>
  79. <Border Name='border2'>
  80. <Button Name='button' Content='{Binding Name, RelativeSource={RelativeSource AncestorType=Border, AncestorLevel=2}}'/>
  81. </Border>
  82. </Border>
  83. </Window>";
  84. var loader = new AvaloniaXamlLoader();
  85. var window = (Window)loader.Load(xaml);
  86. var button = window.FindControl<Button>("button");
  87. window.ApplyTemplate();
  88. Assert.Equal("border1", button.Content);
  89. }
  90. }
  91. [Fact]
  92. public void Binding_To_Ancestor_With_Namespace_Works()
  93. {
  94. using (UnitTestApplication.Start(TestServices.StyledWindow))
  95. {
  96. var xaml = @"
  97. <local:TestWindow xmlns='https://github.com/avaloniaui'
  98. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  99. xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'
  100. Title='title'>
  101. <Button Name='button' Content='{Binding Title, RelativeSource={RelativeSource AncestorType=local:TestWindow}}'/>
  102. </local:TestWindow>";
  103. var loader = new AvaloniaXamlLoader();
  104. var window = (TestWindow)loader.Load(xaml);
  105. var button = window.FindControl<Button>("button");
  106. window.ApplyTemplate();
  107. Assert.Equal("title", button.Content);
  108. }
  109. }
  110. }
  111. public class TestWindow : Window { }
  112. }