A cross-platform UI framework for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

137 lines
3.8 KiB

using Avalonia.Data;
using Xunit;
using Xunit.Sdk;
#nullable enable
namespace Avalonia.Base.UnitTests.Data.Core;
public partial class BindingExpressionTests
{
[Fact]
public void OneTime_Binding_Sets_Target_Only_Once()
{
var data = new ViewModel { StringValue = "foo" };
var target = CreateTargetWithSource(data, x => x.StringValue, mode: BindingMode.OneTime);
Assert.Equal("foo", target.String);
data.StringValue = "bar";
Assert.Equal("foo", target.String);
}
[Fact]
public void OneTime_Binding_Waits_For_DataContext()
{
var data = new ViewModel { StringValue = "foo" };
var target = CreateTarget<ViewModel, string?>(
x => x.StringValue,
mode: BindingMode.OneTime);
Assert.Null(target.String);
}
[Fact]
public void OneTime_Binding_Waits_For_DataContext_With_Matching_Property_Name()
{
var data1 = new { Baz = "baz" };
var data2 = new ViewModel { StringValue = "foo" };
var target = CreateTarget<ViewModel, string?>(
x => x.StringValue,
dataContext: data1,
mode: BindingMode.OneTime);
Assert.Null(target.String);
target.DataContext = data2;
Assert.Equal("foo", target.String);
data2.StringValue = "bar";
Assert.Equal("foo", target.String);
}
[Fact]
public void OneTime_Binding_Waits_For_DataContext_With_Matching_Property_Type()
{
var data1 = new { DoubleValue = new object() };
var data2 = new ViewModel { DoubleValue = 0.5 };
var target = CreateTarget<ViewModel, double>(
x => x.DoubleValue,
dataContext: data1,
mode: BindingMode.OneTime);
Assert.Equal(0, target.Double);
target.DataContext = data2;
Assert.Equal(0.5, target.Double);
data2.DoubleValue = 0.2;
Assert.Equal(0.5, target.Double);
}
[Fact]
public void OneWayToSource_Binding_Updates_Source_When_Target_Changes()
{
var data = new ViewModel();
var target = CreateTarget<ViewModel, string?>(
x => x.StringValue,
dataContext: data,
mode: BindingMode.OneWayToSource);
Assert.Null(data.StringValue);
target.String = "foo";
Assert.Equal("foo", data.StringValue);
}
[Fact]
public void OneWayToSource_Binding_Does_Not_Update_Target_When_Source_Changes()
{
var data = new ViewModel();
var target = CreateTarget<ViewModel, string?>(
x => x.StringValue,
dataContext: data,
mode: BindingMode.OneWayToSource);
target.String = "foo";
Assert.Equal("foo", data.StringValue);
data.StringValue = "bar";
Assert.Equal("foo", target.String);
}
[Fact]
public void OneWayToSource_Binding_Updates_Source_When_DataContext_Changes()
{
var data1 = new ViewModel();
var data2 = new ViewModel();
var target = CreateTarget<ViewModel, string?>(
x => x.StringValue,
dataContext: data1,
mode: BindingMode.OneWayToSource);
target.String = "foo";
Assert.Equal("foo", data1.StringValue);
target.DataContext = data2;
Assert.Equal("foo", data2.StringValue);
}
[Fact]
public void Can_Bind_Readonly_Property_OneWayToSource()
{
var data = new ViewModel();
var target = CreateTarget<ViewModel, string?>(
x => x.StringValue,
dataContext: data,
mode: BindingMode.OneWayToSource,
targetProperty: TargetClass.ReadOnlyStringProperty);
Assert.Equal("readonly", data.StringValue);
target.SetReadOnlyString("foo");
Assert.Equal("foo", data.StringValue);
}
}