【问题标题】:Cannot find source for binding with reference 'RelativeSource FindAncestor' [duplicate]找不到与参考'RelativeSource FindAncestor'绑定的源[重复]
【发布时间】:2013-03-07 19:36:00
【问题描述】:

我收到此错误:

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}}">

ViewModelUserControl 中以DataContext 的身份出现。 DataGridDataContext(位于UserControl)是ViewModel 中的属性,在ViewModel 我有一个变量表示是否显示某一行,它的绑定失败,为什么?

这是我的财产:

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

说到函数:NotifyPropertyChanged PropertyChanged event null - 表示他注册绑定失败。

应该注意的是,我有更多绑定到ViewModel 的方式有效,这里是一个例子:

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

【问题讨论】:

    标签: c# wpf xaml mvvm binding


    【解决方案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));
    }
    

    Credits.

    【讨论】:

    • 现在我收到此错误:BindingExpression 路径错误:在“对象”“BindingProxy”上找不到“IsVisible”属性
    • 糟糕,应该是 Data.IsVisible。
    • 太棒了!终于成功了,非常感谢。
    • 您应该能够使用ElementName="whatevs" 并避免这种重定向。
    • @Will ElementName 使用逻辑树。当元素不使用逻辑树时,您就是 SOL。 stackoverflow.com/questions/705853/…
    猜你喜欢
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2016-04-08
    • 2012-08-16
    • 2011-01-18
    • 2011-04-23
    • 2011-03-12
    • 2018-04-01
    相关资源
    最近更新 更多