diff options
4 files changed, 59 insertions, 0 deletions
diff --git a/Xamarin.PropertyEditing.Tests/BrushPropertyViewModelTests.cs b/Xamarin.PropertyEditing.Tests/BrushPropertyViewModelTests.cs index bf4ccb3..ba0786f 100644 --- a/Xamarin.PropertyEditing.Tests/BrushPropertyViewModelTests.cs +++ b/Xamarin.PropertyEditing.Tests/BrushPropertyViewModelTests.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading; using Moq; using NUnit.Framework; using Xamarin.PropertyEditing.Drawing; @@ -52,5 +53,31 @@ namespace Xamarin.PropertyEditing.Tests Assert.IsTrue (changed); Assert.AreNotEqual (rs1, rs2); } + + [Test] + public void ResourcesChangedUpdatesResources () + { + var mockProperty = new Mock<IPropertyInfo> (); + mockProperty.SetupGet (pi => pi.Type).Returns (typeof (CommonBrush)); + var mockEditor = new MockObjectEditor (mockProperty.Object); + + var resource1 = new Resource ("first"); + var resources = new List<Resource> { resource1 }; + + var provider = new Mock<IResourceProvider>(); + provider.Setup (p => p.GetResourceSourcesAsync (It.IsAny<object> ())).ReturnsAsync (new[] { MockResourceProvider.SystemResourcesSource }); + provider.Setup (p => p.GetResourcesAsync (It.IsAny<object> (), mockProperty.Object, CancellationToken.None)).ReturnsAsync (resources); + + var vm = new BrushPropertyViewModel (new TargetPlatform (new MockEditorProvider(), provider.Object), mockProperty.Object, new [] { mockEditor }); + + Assume.That (vm.ResourceSelector.Resources, Contains.Item (resource1)); + + var resource2 = new Resource ("second"); + resources.Add (resource2); + + provider.Raise (rp => rp.ResourcesChanged += null, new ResourcesChangedEventArgs()); + Assert.That (vm.ResourceSelector.Resources, Contains.Item (resource1)); + Assert.That (vm.ResourceSelector.Resources, Contains.Item (resource2)); + } } } diff --git a/Xamarin.PropertyEditing.Tests/MockControls/MockResourceProvider.cs b/Xamarin.PropertyEditing.Tests/MockControls/MockResourceProvider.cs index 8d5e458..f502626 100644 --- a/Xamarin.PropertyEditing.Tests/MockControls/MockResourceProvider.cs +++ b/Xamarin.PropertyEditing.Tests/MockControls/MockResourceProvider.cs @@ -11,6 +11,8 @@ namespace Xamarin.PropertyEditing.Tests public class MockResourceProvider : IResourceProvider { + public event EventHandler<ResourcesChangedEventArgs> ResourcesChanged; + public bool CanCreateResources => true; public Task<ResourceCreateError> CheckNameErrorsAsync (object target, ResourceSource source, string name) diff --git a/Xamarin.PropertyEditing/IResourceProvider.cs b/Xamarin.PropertyEditing/IResourceProvider.cs index 9b2b143..b67945a 100644 --- a/Xamarin.PropertyEditing/IResourceProvider.cs +++ b/Xamarin.PropertyEditing/IResourceProvider.cs @@ -8,6 +8,8 @@ namespace Xamarin.PropertyEditing { public interface IResourceProvider { + event EventHandler<ResourcesChangedEventArgs> ResourcesChanged; + /// <summary> /// Gets whether or not the resource provider can create resources. /// </summary> @@ -85,4 +87,25 @@ namespace Xamarin.PropertyEditing get; } } + + public class ResourcesChangedEventArgs + : EventArgs + { + public ResourcesChangedEventArgs () + { + } + + public ResourcesChangedEventArgs (ResourceSource source) + { + if (source == null) + throw new ArgumentNullException (nameof(source)); + + Source = source; + } + + public ResourceSource Source + { + get; + } + } }
\ No newline at end of file diff --git a/Xamarin.PropertyEditing/ViewModels/ResourceSelectorViewModel.cs b/Xamarin.PropertyEditing/ViewModels/ResourceSelectorViewModel.cs index f2c3aeb..9b1f0cc 100644 --- a/Xamarin.PropertyEditing/ViewModels/ResourceSelectorViewModel.cs +++ b/Xamarin.PropertyEditing/ViewModels/ResourceSelectorViewModel.cs @@ -21,6 +21,8 @@ namespace Xamarin.PropertyEditing.ViewModels throw new ArgumentNullException (nameof (property)); Provider = provider; + provider.ResourcesChanged += OnResourcesChanged; + this.targets = targets.ToArray(); Property = property; UpdateResources(); @@ -170,6 +172,11 @@ namespace Xamarin.PropertyEditing.ViewModels return true; } + private void OnResourcesChanged (object sender, EventArgs e) + { + UpdateResources (); + } + private async void UpdateResources () { await UpdateResourcesAsync(); |