diff --git a/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs b/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs
index a99582cea7..f2dbd263a0 100644
--- a/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs
+++ b/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs
@@ -77,6 +77,8 @@ namespace Perspex.Markup.Xaml.Data
///
public object Source { get; set; }
+ public ValidationMethods ValidationMethods { get; set; }
+
///
public InstancedBinding Initiate(
IPerspexObject target,
@@ -126,7 +128,7 @@ namespace Perspex.Markup.Xaml.Data
FallbackValue,
Priority);
- return new InstancedBinding(subject, Mode, Priority);
+ return new InstancedBinding(subject, Mode, Priority, ValidationMethods);
}
private static PathInfo ParsePath(string path)
diff --git a/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs b/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs
index 1e996b2b2a..d0dcd069a3 100644
--- a/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs
+++ b/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs
@@ -29,6 +29,7 @@ namespace Perspex.Markup.Xaml.MarkupExtensions
Mode = Mode,
Path = Path,
Priority = Priority,
+ ValidationMethods = ValidationMethods
};
}
@@ -40,5 +41,6 @@ namespace Perspex.Markup.Xaml.MarkupExtensions
public string Path { get; set; }
public BindingPriority Priority { get; set; } = BindingPriority.LocalValue;
public object Source { get; set; }
+ public ValidationMethods ValidationMethods { get; set; } = ValidationMethods.None;
}
}
\ No newline at end of file
diff --git a/src/Markup/Perspex.Markup/Data/Plugins/ExceptionValidationCheckerPlugin.cs b/src/Markup/Perspex.Markup/Data/Plugins/ExceptionValidationCheckerPlugin.cs
index 4c918b8b46..5110f4713e 100644
--- a/src/Markup/Perspex.Markup/Data/Plugins/ExceptionValidationCheckerPlugin.cs
+++ b/src/Markup/Perspex.Markup/Data/Plugins/ExceptionValidationCheckerPlugin.cs
@@ -64,6 +64,11 @@ namespace Perspex.Markup.Data.Plugins
///
public override bool IsValid => Exception == null;
+
+ public override bool Match(ValidationMethods enabledMethods)
+ {
+ return (enabledMethods & ValidationMethods.Exceptions) != 0;
+ }
}
}
}
diff --git a/src/Markup/Perspex.Markup/Data/Plugins/IndeiValidationCheckerPlugin.cs b/src/Markup/Perspex.Markup/Data/Plugins/IndeiValidationCheckerPlugin.cs
index 0959f9b6fc..ee4e87076f 100644
--- a/src/Markup/Perspex.Markup/Data/Plugins/IndeiValidationCheckerPlugin.cs
+++ b/src/Markup/Perspex.Markup/Data/Plugins/IndeiValidationCheckerPlugin.cs
@@ -86,6 +86,11 @@ namespace Perspex.Markup.Data.Plugins
/// The errors on the given property and on the object as a whole.
///
public IEnumerable Errors { get; }
+
+ public override bool Match(ValidationMethods enabledMethods)
+ {
+ return (enabledMethods & ValidationMethods.INotifyDataErrorInfo) != 0;
+ }
}
}
}
diff --git a/src/Perspex.Base/Data/BindingOperations.cs b/src/Perspex.Base/Data/BindingOperations.cs
index efa0c8500d..dbeacfbe90 100644
--- a/src/Perspex.Base/Data/BindingOperations.cs
+++ b/src/Perspex.Base/Data/BindingOperations.cs
@@ -44,10 +44,10 @@ namespace Perspex.Data
{
case BindingMode.Default:
case BindingMode.OneWay:
- return target.Bind(property, binding.Observable ?? binding.Subject, binding.Priority);
+ return target.Bind(property, binding.Observable ?? binding.Subject, binding.Priority, binding.ValidationMethods);
case BindingMode.TwoWay:
return new CompositeDisposable(
- target.Bind(property, binding.Subject, binding.Priority),
+ target.Bind(property, binding.Subject, binding.Priority, binding.ValidationMethods),
target.GetObservable(property).Subscribe(binding.Subject));
case BindingMode.OneTime:
var source = binding.Subject ?? binding.Observable;
diff --git a/src/Perspex.Base/Data/InstancedBinding.cs b/src/Perspex.Base/Data/InstancedBinding.cs
index 545d690aa4..3b911fef35 100644
--- a/src/Perspex.Base/Data/InstancedBinding.cs
+++ b/src/Perspex.Base/Data/InstancedBinding.cs
@@ -29,12 +29,16 @@ namespace Perspex.Data
///
/// The value used for the binding.
///
+ /// The validation methods for this binding.
/// The binding priority.
- public InstancedBinding(object value, BindingPriority priority = BindingPriority.LocalValue)
+ public InstancedBinding(object value,
+ BindingPriority priority = BindingPriority.LocalValue,
+ ValidationMethods methods = ValidationMethods.None)
{
Mode = BindingMode.OneTime;
Priority = priority;
Value = value;
+ ValidationMethods = methods;
}
///
@@ -43,10 +47,12 @@ namespace Perspex.Data
/// The observable for a one-way binding.
/// The binding mode.
/// The binding priority.
+ /// The validation methods for this binding.
public InstancedBinding(
IObservable