Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何将WPF DataGrid DataColumns可见性绑定到UserControl的ViewModel上的属性?_.net_Wpf_Xaml_Mvvm - Fatal编程技术网

.net 如何将WPF DataGrid DataColumns可见性绑定到UserControl的ViewModel上的属性?

.net 如何将WPF DataGrid DataColumns可见性绑定到UserControl的ViewModel上的属性?,.net,wpf,xaml,mvvm,.net,Wpf,Xaml,Mvvm,我有一个包含在UserControl中的WPF数据网格 在用户控件的ViewModel中,我定义了以下内容: 我在XAML中的列定义如下所示: 我在运行时遇到以下异常: System.Windows.Data错误:4:找不到与绑定的源 参考“相对资源查找器”, AncestorType='System.Windows.Controls.UserControl', 1级。BindingExpression:Path=ColumnVisibility; DataItem=null;目标元素是“Dat

我有一个包含在UserControl中的WPF数据网格

在用户控件的ViewModel中,我定义了以下内容:

我在XAML中的列定义如下所示:

我在运行时遇到以下异常:

System.Windows.Data错误:4:找不到与绑定的源 参考“相对资源查找器”, AncestorType='System.Windows.Controls.UserControl', 1级。BindingExpression:Path=ColumnVisibility; DataItem=null;目标元素是“DataGridTextColumn” HashCode=21737301;目标属性是“可见性”类型 “可见性”


将DataGrid列可见性绑定到包含UserControl的ViewModel中定义的属性的最佳方法是什么?

我在AnjumSKhan的SO中找到了一个优雅的解决方案:


为什么要绑定到usercontrol视图模型中的属性时使用RelativeSource?Fre博士:那么正确的绑定方式应该是…?您尝试过这个吗?Visibility={Binding Path=DataContext.ColumnVisibility,RelativeSource={RelativeSource AncestorType=DataGrid}}/>EP:在我的情况下,我的祖先不是UserControl吗?因为它在viewmodel中定义了我的属性
private Visibility _ColumnVisibility;
public Visibility ColumnVisibility
{
get { return _ColumnVisibility;}
set {this._ColumnVisibility= value;
     OnNotifyPropertyChanged("ColumnVisibility");}
}
<DataGrid.Columns>
  <DataGridTextColumn Binding="{Binding UserCode}"
    Header="UserCode"
    Visibility="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=ColumnVisibility}"/>
</DataGrid.Columns>
<!-- 
AnjumSKhan: I would prefer a more elegant approach which involves using a Freezable.
-->
<Window.Resources>
<DiscreteObjectKeyFrame x:Key="FlagKey" Value="{Binding Flag}"/>
</Window.Resources>