Cannot find source for binding with reference 'RelativeSource FindAncestor'
DataGridTemplateColumn
is not part of the visual or logical tree, and therefore has no binding ancestor (or any ancestor) so the RelativeSource
doesn't work.
Instead you have to give the binding the source explicitly.
<UserControl.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</UserControl.Resources>
<DataGridTemplateColumn Visibility="{Binding Data.IsVisible,
Source={StaticResource proxy},
Converter={StaticResource BooleanToVisibilityConverter}}">
And the binding proxy.
public class BindingProxy : Freezable
{
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
// Using a DependencyProperty as the backing store for Data.
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object),
typeof(BindingProxy), new UIPropertyMetadata(null));
}
![Hodaya Shalom](https://i.stack.imgur.com/VRMBo.jpg?s=256&g=1)
Hodaya Shalom
Updated on August 06, 2022Comments
-
Hodaya Shalom almost 2 years
I get this error:
Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''
On this Binding:
<DataGridTemplateColumn Visibility="{Binding DataContext.IsVisible, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Converter={StaticResource BooleanToVisibilityConverter}}">
The
ViewModel
is sitting asDataContext
inUserControl
. TheDataContext
of theDataGrid
(sitting inUserControl
) is property within theViewModel
, inViewModel
I have a variable that says whether to show a certain line or not, its binding fails, why?Here my property :
private bool _isVisible=false; public bool IsVisible { get { return _isVisible; } set { _isVisible= value; NotifyPropertyChanged("IsVisible"); } }
When it comes to the function:
NotifyPropertyChanged
thePropertyChanged
event null - mean he failed to register for the binding.It should be noted that I have more bindings to
ViewModel
in such a way that works, here is an example:Command="{Binding DataContext.Cmd, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
-
Hodaya Shalom over 11 yearsNow i get this error: BindingExpression path error: 'IsVisible' property not found on 'object' ''BindingProxy'
-
Cameron MacFarland over 11 yearsWhoops, that should be Data.IsVisible.
-
Hodaya Shalom over 11 yearsGreat! It works at last, thank you very much.
-
Admin over 11 yearsYou should be able to use an
ElementName="whatevs"
and avoid this redirection. -
Hodaya Shalom over 11 years@Will, I tried this way - it did not work.
-
Cameron MacFarland over 11 years@Will ElementName uses the logical tree. When the element doesn't use the logical tree you're SOL. stackoverflow.com/questions/705853/…
-
Informagic over 5 yearsOutstanding. It’s also the solution in cases where the
ContextMenu
is defined within a customTriggerAction
—see stackoverflow.com/questions/54415381/….