I have a control which has a default value for a property. When the control first gets its dataContext set, it assigns this property automatically.
In the xaml now, I want it to be possible to UNset this property. I’ve tried setting it to x:Null of just the empty string, but then I get an error because there’s no converter for the property. How do I simply unassign this property from the xaml in the rare cases where I want the feature disabled?
code where it is originally set:
void OmniBox_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if( e.NewValue is BindingObjectBaseExtended )
{
BindingObjectBaseExtended value = (BindingObjectBaseExtended)e.NewValue;
this.SetBinding(OmniBox.ContextValidationMessagesProperty, new Binding() { Source = value, Path = new PropertyPath("ValidationMessages") });
}
}
xaml where I want to unset the property.
<Style TargetType="ui:OmniBox">
<Setter Property="ContextValidationMessages" Value="" />
</Style>
Note that if I do not set up the binding automatically when the data context changes, then by default there are no validation messages and I have to do the following in the xaml to set them up:
<Style TargetType="ui:OmniBox">
<Setter Property="ContextValidationMessages" Value="ValidationMessages" />
</Style>
What I’m trying to do is make the above binding the default for my custom OmniBox control, and allow the user to unset it or change it to something else.
Personally, I would create a separate dependency property, such as
bool AutoBindValidationand make it default to true. If it is false, don’t do anything when the DataContext changes. This is a little more self-documenting. Depending on what exactly you’re trying to do, you might not want to publicly exposeContextValidationMessagesat all.If you really want to do it the way you posted, I’m not sure why setting it to
{x:Null}would cause an error (unless the property type is not nullable). But this approach would have problems becauseDataContextChangedis going to occur after the XAML is parsed. So the user can set it to{x:Null}, but then the DataContext will change and your code will set up the default binding and trample the user’s value. You could set up the binding in the control’s contstructor, but then if the DataContext does not have aValidationMessagesproperty, your control will be spitting out binding errors.