diff --git a/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs b/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs
index 588cc12f0e..a99582cea7 100644
--- a/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs
+++ b/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs
@@ -16,6 +16,22 @@ namespace Perspex.Markup.Xaml.Data
///
public class Binding : IBinding
{
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public Binding()
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The binding path.
+ public Binding(string path)
+ {
+ Path = path;
+ }
+
///
/// Gets or sets the to use.
///
diff --git a/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs b/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
index ab8a7090e7..333f4e9411 100644
--- a/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
+++ b/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
@@ -1,6 +1,7 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
+using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Perspex.Collections;
@@ -8,6 +9,8 @@ using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.Interactivity;
+using Perspex.Markup.Xaml.Data;
+using Perspex.UnitTests;
using Xunit;
namespace Perspex.Controls.UnitTests.Primitives
@@ -487,6 +490,56 @@ namespace Perspex.Controls.UnitTests.Primitives
Assert.True(called);
}
+ [Fact]
+ public void Changing_DataContext_Should_Not_Clear_Nested_ViewModel_SelectedItem()
+ {
+ var items = new[]
+ {
+ new Item(),
+ new Item(),
+ };
+
+ var vm = new MasterViewModel
+ {
+ Child = new ChildViewModel
+ {
+ Items = items,
+ SelectedItem = items[1],
+ }
+ };
+
+ var target = new SelectingItemsControl { DataContext = vm };
+ var itemsBinding = new Binding("Child.Items");
+ var selectedBinding = new Binding("Child.SelectedItem");
+
+ target.Bind(SelectingItemsControl.ItemsProperty, itemsBinding);
+ target.Bind(SelectingItemsControl.SelectedItemProperty, selectedBinding);
+
+ Assert.Equal(1, target.SelectedIndex);
+ Assert.Same(vm.Child.SelectedItem, target.SelectedItem);
+
+ items = new[]
+ {
+ new Item(),
+ new Item(),
+ new Item(),
+ };
+
+ vm = new MasterViewModel
+ {
+ Child = new ChildViewModel
+ {
+ Items = items,
+ SelectedItem = items[2],
+ }
+ };
+
+ target.DataContext = vm;
+
+ Assert.Equal(2, target.SelectedIndex);
+ Assert.Same(vm.Child.SelectedItem, target.SelectedItem);
+ }
+
private FuncControlTemplate Template()
{
return new FuncControlTemplate(control =>
@@ -502,5 +555,26 @@ namespace Perspex.Controls.UnitTests.Primitives
{
public bool IsSelected { get; set; }
}
+
+ private class MasterViewModel : NotifyingBase
+ {
+ private ChildViewModel _child;
+
+ public ChildViewModel Child
+ {
+ get { return _child; }
+ set
+ {
+ _child = value;
+ RaisePropertyChanged();
+ }
+ }
+ }
+
+ private class ChildViewModel : NotifyingBase
+ {
+ public IList- Items { get; set; }
+ public Item SelectedItem { get; set; }
+ }
}
}