Skip to content

Commit

Permalink
[C] 2W bindings always apply
Browse files Browse the repository at this point in the history
don't ask me why, that's how it is

- fixes #16849
  • Loading branch information
StephaneDelcroix committed Aug 30, 2023
1 parent 8eaa9f1 commit 5bdc54a
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/Controls/src/Core/BindableObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ public void RemoveBinding(BindableProperty property)

/// <include file="../../docs/Microsoft.Maui.Controls/BindableObject.xml" path="//Member[@MemberName='SetBinding']/Docs/*" />
public void SetBinding(BindableProperty targetProperty, BindingBase binding)
=> SetBinding(targetProperty, binding, SetterSpecificity.FromBinding);
=> SetBinding(targetProperty, binding, binding != null && targetProperty != null && binding.GetRealizedMode(targetProperty) == BindingMode.TwoWay ? SetterSpecificity.FromHandler : SetterSpecificity.FromBinding);

internal void SetBinding(BindableProperty targetProperty, BindingBase binding, SetterSpecificity specificity)
{
Expand Down
30 changes: 30 additions & 0 deletions src/Controls/tests/Core.UnitTests/BindingUnitTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2308,5 +2308,35 @@ public void NullRefWithDefaultCtor()
var label = new Label();
label.SetBinding(Label.TextColorProperty, new Binding());
}

[Fact]
//https://github.com/dotnet/maui/issues/16849
public void ValueFromHandlerDoesntClearWayBinding()
{
var vm = new MockViewModel();
var entry = new Entry { BindingContext = vm};
entry.SetBinding(Entry.TextProperty, "Text", BindingMode.TwoWay);
entry.SetValueFromRenderer(Entry.TextProperty, "foo");
Assert.Equal("foo", vm.Text);
vm.Text = "bar";
Assert.Equal("bar", entry.Text);
vm.Text = string.Empty;
Assert.Equal(string.Empty, entry.Text);
}

[Fact]
//https://github.com/dotnet/maui/issues/16849
public void ManualValueDoesntClearWayBinding()
{
var vm = new MockViewModel();
var entry = new Entry { BindingContext = vm };
entry.SetBinding(Entry.TextProperty, "Text", BindingMode.TwoWay);
entry.SetValue(Entry.TextProperty, "foo");
Assert.Equal("foo", vm.Text);
vm.Text = "bar";
Assert.Equal("bar", entry.Text);
vm.Text = string.Empty;
Assert.Equal(string.Empty, entry.Text);
}
}
}

0 comments on commit 5bdc54a

Please sign in to comment.