public void WhenValueProviderTypeIdChanged_ThenBindingRaisesChanged()
        {
            var raised = false;
            var provider = new ValueProviderBindingSettings();
            var binding = new BindingSettings
            {
                Properties = 
                {
                    new PropertyBindingSettings
                    {
                        ValueProvider = provider,
                    }
                }
            };

            binding.PropertyChanged += (sender, args) => raised = true;

            provider.TypeId = "foo";

            Assert.True(raised);
        }
        private static void AddPropertySettings(XElement cmdPropsElement, IList<IPropertyBindingSettings> bindings, XElement propSettingElement, IList<XElement> processedPropertySettings)
        {
            // Create a PropertyBindingSettings from the <PropertySettings> element.
            if (propSettingElement.Attributes().Any(a => a.Name == PropertySettingsNameName))
            {
                var binding = new PropertyBindingSettings
                {
                    Name = TrimName(propSettingElement.Attribute(PropertySettingsNameName).Value),
                    Value = propSettingElement.Attributes().Any(a => a.Name == PropertySettingsValueName)
                            ? DecodeValue(propSettingElement.Attribute(PropertySettingsValueName).Value)
                            : null,
                };

                // Determine if has a ValueProvider
                var valueProviderElement = propSettingElement.Descendants(ValueProviderElementName)
                                      .FirstOrDefault();
                if (valueProviderElement != null)
                {
                    var valueProviderSettingsElement = valueProviderElement.Descendants(ValueProviderSettingElementName)
                                            .FirstOrDefault();
                    if (valueProviderSettingsElement != null)
                    {
                        if (valueProviderSettingsElement.Attributes().Any(a => a.Name == ValueProviderSettingsIdName))
                        {
                            var vpBinding = new ValueProviderBindingSettings
                            {
                                TypeId = valueProviderSettingsElement.Attribute(ValueProviderSettingsTypeIdName).Value,
                            };

                            // Determine if the ValueProvider has nested <propertySettings> elements
                            var propSettingsMonikers = valueProviderSettingsElement.Descendants(PropertySettingMonikerElementName);
                            if (propSettingsMonikers.Any())
                            {
                                // Match each nested <propertySettings> element, which should be linked to <commandSettings><properties>
                                propSettingsMonikers.ForEach(psm =>
                                {
                                    var psmId = psm.Attribute(PropertySettingsMonikerIdName).Value;
                                    var vpPropSettings = cmdPropsElement.Descendants(PropertySettingsElementName)
                                            .FirstOrDefault(pse => pse.Attribute(PropertySettingsIdName).Value == psmId);
                                    if (vpPropSettings != null)
                                    {
                                        // Cache <propertySetting> element
                                        processedPropertySettings.Add(vpPropSettings);

                                        // Create Bindings
                                        AddPropertySettings(cmdPropsElement, vpBinding.Properties, vpPropSettings, processedPropertySettings);
                                    }
                                });
                            }

                            binding.ValueProvider = vpBinding;
                        }
                    }
                }

                bindings.Add(binding);
            }
        }
            public void WhenValueProviderAndNoDefaultValue_ThenValidateValueProviderOrDefaultValueSucceeds()
            {
                PropertyBindingSettings defaultValueBindings = new PropertyBindingSettings();
                defaultValueBindings.Value = "";
                defaultValueBindings.ValueProvider = new ValueProviderBindingSettings
                {
                    TypeId = ""
                };
                ValueProviderBindingSettings valueProviderBindings = new ValueProviderBindingSettings
                {
                    TypeId = "Foo"
                };
                this.store.TransactionManager.DoWithinTransaction(() =>
                {
                    this.property.DefaultValue = defaultValueBindings;
                    this.property.ValueProvider = valueProviderBindings;
                });
                this.property.ValidateValueProviderOrDefaultValue(validationContext);

                Assert.True(validationContext.CurrentViolations.Count == 0);
                Assert.True(validationContext.ValidationSubjects.IndexOf(this.property) == 0);
            }