web-dev-qa-db-ja.com

参照 '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}}">

ViewModelは、UserControlのDataContextとして座っています。 DataGrid(UserControlにある)のDataContextはViewModel内のプロパティです。ViewModelには、特定の行を表示するかどうかを示す変数があり、そのバインドは失敗します。なぜですか?

ここに私の財産:

    private bool _isVisible=false;

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

関数の場合:NotifyPropertyChanged PropertyChangedイベントnull-バインディングの登録に失敗したことを意味します。

動作するような方法でViewModelにさらにバインディングがあることに注意してください。ここに例を示します。

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

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

クレジット

66