找不到与参考'RelativeSource FindAncestor'绑定的源。

45

我遇到了这个错误:

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作为UserControl中的DataContextDataGrid(坐落在UserControl中)的DataContextViewModel中的一个属性,在ViewModel中,我有一个变量来判断是否显示某一行,但它的绑定失败了,为什么呢?
这是我的属性:
private bool _isVisible=false;
public bool IsVisible
{
    get { return _isVisible; }
    set
    {
        _isVisible= value;
        NotifyPropertyChanged("IsVisible");
    }
}

谈到函数:NotifyPropertyChangedPropertyChanged事件为null表示未成功注册绑定。

需要注意的是,我对ViewModel进行了更多的绑定,它们按照这种方式工作,以下是一个示例:

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

90

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

学分


现在我遇到了这个错误:BindingExpression路径错误:在“BindingProxy”对象上找不到“IsVisible”属性。 - Hodaya Shalom
2
糟糕,应该是Data.IsVisible。 - Cameron MacFarland
你应该能够使用 ElementName="whatevs" 并避免这种重定向。 - user1228
@Will,我尝试了这种方法 - 它没有起作用。 - Hodaya Shalom
3
@Will ElementName 使用逻辑树。当元素不使用逻辑树时,你就束手无策了。https://dev59.com/0HRB5IYBdhLWcg3wJUeu - Cameron MacFarland
非常出色。这也是在自定义的TriggerAction中定义ContextMenu的情况下的解决方案 - 请参见https://stackoverflow.com/questions/54415381/in-mvvm-open-context-menu-upon-drag-completion。 - Informagic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接