2013-03-19 4 views
30

바인딩의 소스를 찾을 수 없습니다. UserControl에 앉아있는 DataGrid의 DataContext는 ViewModel의 ViewModel 내에있는 속성입니다. 특정 행을 표시할지 여부를 나타내는 변수가 있는데, 해당 바인딩이 실패합니다. 이유는 무엇입니까? 여기내가이 오류 참조 'RelativeSource FindAncestor'

내 재산은 :

private bool _isVisible=false; 

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

는 기능에 관해서 다음하여 PropertyChanged 이벤트는 null를 NotifyPropertyChanged - 평균 그는 바인딩을 등록하지 못했습니다.

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

Whoops, Data.IsVisible이어야합니다. –

+0

좋아요! 마침내 작동합니다. 대단히 감사합니다. –

관련 문제