Невозможно найти источник для привязки со ссылкой "RelativeSource FindAncestor"
Я получаю эту ошибку:
Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''
в этом привязке:
<DataGridTemplateColumn Visibility="{Binding DataContext.IsVisible, RelativeSource={RelativeSource AncestorType={x:Type UserControl}},Converter={StaticResource BooleanToVisibilityConverter}}">
ViewModel располагается как DataContext в UserControl. DataContext DataGrid (сидит в UserControl) является свойством в ViewModel, в ViewModel У меня есть переменная, которая говорит, показывать ли определенную строку или нет, ее привязка не удалась, почему?
Здесь моя собственность:
private bool _isVisible=false;
public bool IsVisible
{
get { return _isVisible; }
set
{
_isVisible= value;
NotifyPropertyChanged("IsVisible");
}
}
Когда дело доходит до функции: NotifyPropertyChanged событие PropertyChanged null - значит, он не смог зарегистрироваться для привязки.
Следует отметить, что у меня больше привязок к ViewModel таким образом, что это работает, вот пример:
Command="{Binding DataContext.Cmd, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
Ответы
Ответ 1
DataGridTemplateColumn
не является частью визуального или логического дерева и поэтому не имеет обязательного предка (или любого предка), поэтому RelativeSource
не работает.
Вместо этого вы должны явно указать привязку источника.
<UserControl.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</UserControl.Resources>
<DataGridTemplateColumn Visibility="{Binding Data.IsVisible,
Source={StaticResource proxy},
Converter={StaticResource BooleanToVisibilityConverter}}">
И связующий прокси.
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));
}
Кредиты.