2013-03-19 8 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イベントのヌルをNotifyPropertyChanged - 平均彼は結合のための登録に失敗しました。

ここでの例ですが、私が働くようにViewModelにに多くのバインディングを持っていることに留意すべきである:

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' –

+1

Whoops、それはData.IsVisibleである必要があります。 –

+0

素晴らしい!ようやく、ありがとうございました。 –

関連する問題