2013-03-19 96 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}}"> 

視圖模型坐在如DataContext的用戶控件中。 DataGrid的DataContext(坐在UserControl中)是ViewModel中的屬性,在ViewModel中我有一個變量,表示是否顯示某一行,它的綁定失敗,爲什麼?

這裏我的財產:

private bool _isVisible=false; 

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

當涉及到的功能:NotifyPropertyChanged PropertyChanged事件空 - 意味着他無法爲綁定註冊。

應當指出的是,我有更多的綁定視圖模型在這樣一個可行的辦法,這裏有一個例子:

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'屬性'''BindingProxy' – 2013-03-19 08:38:59

+1

哎呀,那應該是Data.IsVisible。 – 2013-03-19 09:14:00

+0

太棒了!它最後工作,非常感謝。 – 2013-03-19 09:20:01

相關問題