2013-03-19 2 views
30

Я получаю эту ошибку:Не удается найти источник для связывания со ссылкой '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 - значит, что он не удалось зарегистрировать для связывания.

Следует отметить, что у меня есть больше привязок к ViewModel таким образом, что работает, вот пример:

Command="{Binding DataContext.Cmd, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" 

ответ

49

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)); 
} 

Credits.

+0

Теперь я получаю эту ошибку: Ошибка пути BindingExpression: свойство IsVisible не найдено в 'object' '' BindingProxy ' –

+1

Упс, это должно быть Data.IsVisible. –

+0

Отлично! Он работает наконец, большое спасибо. –

Смежные вопросы