在XAML中数据绑定到父datacontext

时间:2013-03-28 11:57:26

标签: wpf xaml

这两个元素所在的用户控件具有一个名为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')

2 个答案:

答案 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 ); 
        } 
    } 
}
相关问题