MultiValueConverterTests.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using Avalonia.Controls;
  5. using Avalonia.Data;
  6. using Avalonia.Data.Converters;
  7. using Avalonia.UnitTests;
  8. using Xunit;
  9. namespace Avalonia.Markup.Xaml.UnitTests.Converters
  10. {
  11. public class MultiValueConverterTests : XamlTestBase
  12. {
  13. [Fact]
  14. public void MultiValueConverter_Special_Values_Work()
  15. {
  16. using (UnitTestApplication.Start(TestServices.StyledWindow))
  17. {
  18. var xaml = @"
  19. <Window xmlns='https://github.com/avaloniaui'
  20. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  21. xmlns:c='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Converters;assembly=Avalonia.Markup.Xaml.UnitTests'>
  22. <TextBlock Name='textBlock'>
  23. <TextBlock.Tag>
  24. <MultiBinding Converter='{x:Static c:TestMultiValueConverter.Instance}' FallbackValue='bar'>
  25. <Binding Path='Item1' />
  26. <Binding Path='Item2' />
  27. </MultiBinding>
  28. </TextBlock.Tag>
  29. </TextBlock>
  30. </Window>";
  31. var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
  32. var textBlock = window.FindControl<TextBlock>("textBlock");
  33. window.ApplyTemplate();
  34. window.DataContext = Tuple.Create(2, 2);
  35. Assert.Equal("foo", textBlock.Tag);
  36. window.DataContext = Tuple.Create(-3, 3);
  37. Assert.Equal("foo", textBlock.Tag);
  38. window.DataContext = Tuple.Create(0, 2);
  39. Assert.Equal("bar", textBlock.Tag);
  40. }
  41. }
  42. }
  43. public class TestMultiValueConverter : IMultiValueConverter
  44. {
  45. public static readonly TestMultiValueConverter Instance = new TestMultiValueConverter();
  46. public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)
  47. {
  48. if (values[0] is int i && values[1] is int j)
  49. {
  50. var p = i * j;
  51. if (p > 0)
  52. {
  53. return "foo";
  54. }
  55. if (p == 0)
  56. {
  57. return AvaloniaProperty.UnsetValue;
  58. }
  59. return BindingOperations.DoNothing;
  60. }
  61. return "(default)";
  62. }
  63. }
  64. }