私はこのエラーを受け取ります:
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}}}"
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));
}
クレジット 。