using System.Collections.Generic; using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Logging; using Avalonia.UnitTests; using Xunit; namespace Avalonia.Markup.Xaml.UnitTests.Xaml { public class ControlBindingTests : XamlTestBase { [Fact] public void Binding_ProgressBar_Value_To_Invalid_Value_Uses_FallbackValue() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var loader = new AvaloniaXamlLoader(); var window = (Window)loader.Load(xaml); var progressBar = (ProgressBar)window.Content; window.DataContext = new { Value = "foo" }; window.ApplyTemplate(); Assert.Equal(3, progressBar.Value); } } [Fact] public void Invalid_FallbackValue_Logs_Error() { var called = false; LogCallback checkLogMessage = (level, area, src, mt, pv) => { if (level == LogEventLevel.Warning && area == LogArea.Binding && mt == "Error in binding to {Target}.{Property}: {Message}" && pv.Length == 3 && pv[0] is ProgressBar && object.ReferenceEquals(pv[1], ProgressBar.ValueProperty) && (string)pv[2] == "Could not convert FallbackValue 'bar' to 'System.Double'") { called = true; } }; using (UnitTestApplication.Start(TestServices.StyledWindow)) using (TestLogSink.Start(checkLogMessage)) { var xaml = @" "; var loader = new AvaloniaXamlLoader(); var window = (Window)loader.Load(xaml); var progressBar = (ProgressBar)window.Content; window.DataContext = new { Value = "foo" }; window.ApplyTemplate(); Assert.Equal(0, progressBar.Value); Assert.True(called); } } [Fact] public void Can_Bind_Between_TabStrip_And_Carousel() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var loader = new AvaloniaXamlLoader(); var window = (Window)loader.Load(xaml); var strip = window.FindControl("strip"); var carousel = window.FindControl("carousel"); window.DataContext = new ItemsViewModel { Items = new[] { new ItemViewModel { Header = "Item1", Detail = "Detail1" }, new ItemViewModel { Header = "Item2", Detail = "Detail2" }, } }; window.Show(); Assert.Equal(0, strip.SelectedIndex); Assert.Equal(0, carousel.SelectedIndex); } } private class ItemsViewModel { public IList Items { get; set; } } private class ItemViewModel { public string Header { get; set; } public string Detail { get; set; } } } }