42

次のエラーが表示されます。

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座っています。の(座っている)は 内のプロパティです。特定の行を表示するかどうかを示す変数があります。そのバインディングはなぜ失敗しますか?DataContextUserControlDataContextDataGridUserControlViewModelViewModel

ここに私の財産:

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

関数に関して言えばNotifyPropertyChangedPropertyChangedイベント null - 彼がバインディングの登録に失敗したことを意味します。

機能するような方法でより多くのバインディングがあることに注意してくださいViewModel。以下に例を示します。

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

1 に答える 1

85

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

クレジット

于 2013-03-19T08:21:28.063 に答える