public void Should_Not_Write_To_Old_DataContext() { var vm = new OldDataContextViewModel(); var target = new TestSelector(); var itemsBinding = new Binding { Path = "Items", Mode = BindingMode.OneWay, }; var selectedItemsBinding = new Binding { Path = "SelectedItems", Mode = BindingMode.OneWay, }; // Bind Items and SelectedItems to the VM. target.Bind(TestSelector.ItemsProperty, itemsBinding); target.Bind(TestSelector.SelectedItemsProperty, selectedItemsBinding); // Set DataContext and SelectedIndex target.DataContext = vm; target.SelectedIndex = 1; // Make sure SelectedItems are written back to VM. Assert.Equal(new[] { "bar" }, vm.SelectedItems); // Clear DataContext and ensure that SelectedItems is still set in the VM. target.DataContext = null; Assert.Equal(new[] { "bar" }, vm.SelectedItems); // Ensure target's SelectedItems is now clear. Assert.Empty(target.SelectedItems); }
public void Should_Not_Write_To_Old_DataContext() { var vm = new OldDataContextViewModel(); var target = new OldDataContextTest(); var fooBinding = new Binding { Path = "Foo", Mode = BindingMode.TwoWay, }; var barBinding = new Binding { Path = "Bar", Mode = BindingMode.TwoWay, }; // Bind Foo and Bar to the VM. target.Bind(OldDataContextTest.FooProperty, fooBinding); target.Bind(OldDataContextTest.BarProperty, barBinding); target.DataContext = vm; // Make sure the control's Foo and Bar properties are read from the VM Assert.Equal(1, target.GetValue(OldDataContextTest.FooProperty)); Assert.Equal(2, target.GetValue(OldDataContextTest.BarProperty)); // Set DataContext to null. target.DataContext = null; // Foo and Bar are no longer bound so they return 0, their default value. Assert.Equal(0, target.GetValue(OldDataContextTest.FooProperty)); Assert.Equal(0, target.GetValue(OldDataContextTest.BarProperty)); // The problem was here - DataContext is now null, setting Foo to 0. Bar is bound to // Foo so Bar also gets set to 0. However the Bar binding still had a reference to // the VM and so vm.Bar was set to 0 erroneously. Assert.Equal(1, vm.Foo); Assert.Equal(2, vm.Bar); }
public void Should_Not_Write_To_Old_DataContext() { var vm = new OldDataContextViewModel(); var target = new OldDataContextTest(); var fooBinding = new XamlBinding { SourcePropertyPath = "Foo", BindingMode = BindingMode.TwoWay, }; var barBinding = new XamlBinding { SourcePropertyPath = "Bar", BindingMode = BindingMode.TwoWay, }; // Bind Foo and Bar to the VM. fooBinding.Bind(target, OldDataContextTest.FooProperty); barBinding.Bind(target, OldDataContextTest.BarProperty); target.DataContext = vm; // Make sure the control's Foo and Bar properties are read from the VM Assert.Equal(1, target.GetValue(OldDataContextTest.FooProperty)); Assert.Equal(2, target.GetValue(OldDataContextTest.BarProperty)); // Set DataContext to null. target.DataContext = null; // Foo and Bar are no longer bound so they return 0, their default value. Assert.Equal(0, target.GetValue(OldDataContextTest.FooProperty)); Assert.Equal(0, target.GetValue(OldDataContextTest.BarProperty)); // The problem was here - DataContext is now null, setting Foo to 0. Bar is bound to // Foo so Bar also gets set to 0. However the Bar binding still had a reference to // the VM and so vm.Bar was set to 0 erroneously. Assert.Equal(1, vm.Foo); Assert.Equal(2, vm.Bar); }
public void Should_Not_Write_To_Old_DataContext() { var vm = new OldDataContextViewModel(); var target = new TestSelector(); var itemsBinding = new Binding { Path = "Items", Mode = BindingMode.OneWay, }; var selectedItemsBinding = new Binding { Path = "SelectedItems", Mode = BindingMode.OneWay, }; // Bind Items and SelectedItems to the VM. itemsBinding.Bind(target, TestSelector.ItemsProperty); selectedItemsBinding.Bind(target, TestSelector.SelectedItemsProperty); // Set DataContext and SelectedIndex target.DataContext = vm; target.SelectedIndex = 1; // Make sure SelectedItems are written back to VM. Assert.Equal(new[] { "bar" }, vm.SelectedItems); // Clear DataContext and ensure that SelectedItems is still set in the VM. target.DataContext = null; Assert.Equal(new[] { "bar" }, vm.SelectedItems); // Ensure target's SelectedItems is now clear. Assert.Empty(target.SelectedItems); }