这两个元素所在的用户控件具有一个名为ColumnTypes的属性。
这些元素中的每一个都使用相同的表达式引用主datacontext,但第一个使用不工作,而后者则工作。
你知道如何调查吗?
<DataGrid x:Name="DataGrid" AutoGenerateColumns="False" ItemsSource="{Binding Table}" >
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Type" >
<DataGridComboBoxColumn.ItemsSource>
<Binding Path="DataContext.GetColumnTypes" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" />
</DataGridComboBoxColumn.ItemsSource>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
<ComboBox Grid.Row="1">
<ComboBox.ItemsSource>
<Binding Path="DataContext.GetColumnTypes" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" />
</ComboBox.ItemsSource>
</ComboBox>
System.Windows.Data错误:4:无法找到绑定源,引用'RelativeSource FindAncestor,AncestorType ='System.Windows.Controls.UserControl',AncestorLevel ='1''。 BindingExpression:路径= DataContext.GetColumnTypes;的DataItem = NULL; target元素是'DataGridComboBoxColumn'(HashCode = 53813616); target属性是'ItemsSource'(类型'IEnumerable')
答案 0 :(得分:8)
这是DataGridComboBoxColumn
的已知限制。
您可以看到on MSDN您可以将哪些内容绑定到其ItemsSource
属性。常规财产不是其中之一,所以你的情况不会有效。
实现目标的另一种方法是制作包含DataGridTemplateColumn
的{{1}}。
在你的情况下看起来像这样:
ComboBox
答案 1 :(得分:3)
DataGridColumn
不在于DataGrid的Visual Tree
,因此can't inherit its DataContext
。但是有一些解决方法,即您可以显式地向DataGridColumns提供DataContext,其详细信息可以找到Provide DataContext to DataGrid Columns。
另外,我个人喜欢这里描述的方法 - Inheriting parent DataContext using Freezable继承使用Freezable
类。
来自first link
的代码,以防以后链接不起作用 -
在App.xaml.cs in App() constructor
-
FrameworkElement.DataContextProperty.AddOwner(typeof(DataGridColumn));
FrameworkElement.DataContextProperty.OverrideMetadata ( typeof(DataGrid),
new FrameworkPropertyMetadata
(null, FrameworkPropertyMetadataOptions.Inherits,
new PropertyChangedCallback(OnDataContextChanged)));
OnDataContextChanged回调只是将DataContext从DataGrid转发到其列:
public static void OnDataContextChanged ( DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
DataGrid grid = d as DataGrid ;
if ( grid != null )
{
foreach ( DataGridColumn col in grid.Columns )
{
col.SetValue ( FrameworkElement.DataContextProperty, e.NewValue );
}
}
}