42

我收到此错误:

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,在我有一个变量表示是否显示某一行,它的绑定失败,为什么?DataContextDataGridUserControlViewModelViewModel

这是我的财产:

private bool _isVisible=false;
public bool IsVisible
{
    get { return _isVisible; }
    set
    {
        _isVisible= value;
        NotifyPropertyChanged("IsVisible");
    }
}

说到函数:事件NotifyPropertyChangedPropertyChangednull——意味着他没有注册绑定。

应该注意的是,我有更多的绑定以ViewModel这样的方式工作,这是一个例子:

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

1 回答 1

85

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

学分

于 2013-03-19T08:21:28.063 回答