diff --git a/src/Markup/Avalonia.Markup/Data/MultiBinding.cs b/src/Markup/Avalonia.Markup/Data/MultiBinding.cs
index 19f92149ec..29945e25c3 100644
--- a/src/Markup/Avalonia.Markup/Data/MultiBinding.cs
+++ b/src/Markup/Avalonia.Markup/Data/MultiBinding.cs
@@ -76,7 +76,12 @@ namespace Avalonia.Data
}
var children = Bindings.Select(x => x.Initiate(target, null));
- var input = children.Select(x => x.Observable).CombineLatest().Select(x => ConvertValue(x, targetType, converter));
+
+ var input = children.Select(x => x.Observable)
+ .CombineLatest()
+ .Select(x => ConvertValue(x, targetType, converter))
+ .Where(x => x != BindingOperations.DoNothing);
+
var mode = Mode == BindingMode.Default ?
targetProperty?.GetMetadata(target.GetType()).DefaultBindingMode : Mode;
@@ -97,11 +102,6 @@ namespace Avalonia.Data
var culture = CultureInfo.CurrentCulture;
var converted = converter.Convert(values, targetType, ConverterParameter, culture);
- if (converted == BindingOperations.DoNothing)
- {
- return converted;
- }
-
if (converted == AvaloniaProperty.UnsetValue)
{
converted = FallbackValue;
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/MultiValueConverterTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/MultiValueConverterTests.cs
new file mode 100644
index 0000000000..a77723afe1
--- /dev/null
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/MultiValueConverterTests.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using Avalonia.Controls;
+using Avalonia.Data;
+using Avalonia.Data.Converters;
+using Avalonia.UnitTests;
+using Xunit;
+
+namespace Avalonia.Markup.Xaml.UnitTests.Converters
+{
+ public class MultiValueConverterTests : XamlTestBase
+ {
+ [Fact]
+ public void MultiValueConverter_Special_Values_Work()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var xaml = @"
+
+
+
+
+
+
+
+
+
+";
+ var loader = new AvaloniaXamlLoader();
+ var window = (Window)loader.Load(xaml);
+ var textBlock = window.FindControl("textBlock");
+
+ window.ApplyTemplate();
+
+ window.DataContext = Tuple.Create(2, 2);
+ Assert.Equal("foo", textBlock.Text);
+
+ window.DataContext = Tuple.Create(-3, 3);
+ Assert.Equal("foo", textBlock.Text);
+
+ window.DataContext = Tuple.Create(0, 2);
+ Assert.Equal("bar", textBlock.Text);
+ }
+ }
+ }
+
+ public class TestMultiValueConverter : IMultiValueConverter
+ {
+ public static readonly TestMultiValueConverter Instance = new TestMultiValueConverter();
+
+ public object Convert(IList