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; } + } } }