4

这两个元素所在的用户控件有一个名为 ColumnTypes 的属性。

这些元素中的每一个都以相同的表达式相对地引用主数据上下文,但第一个不起作用而后者起作用。

你知道如何调查吗?

<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:Path=DataContext.GetColumnTypes; 数据项=空;目标元素是“DataGridComboBoxColumn”(HashCode=53813616);目标属性是“ItemsSource”(类型“IEnumerable”)

4

2 回答 2

8

这是DataGridComboBoxColumn.

您可以在 MSDN 上查看可以将哪些内容绑定到它的ItemsSource属性。常规财产不是其中之一,因此您的情况将不起作用。

实现您想要的另一种方法是制作DataGridTemplateColumn包含 a 的 a ComboBox

在你的情况下,看起来像这样:

<DataGrid.Columns>
    <DataGridTemplateColumn Header="Type">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox ItemsSource="{Binding DataContext.GetColumnTypes, 
                        RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>
于 2013-03-28T13:18:48.700 回答
3

DataGridColumn不在于Visual TreeDataGrid 因此它can't inherit its DataContext。但是有一些解决方法,即您可以明确地将 DataContext 提供给您的 DataGridColumns ,可以找到其详细信息将DataContext 提供给 DataGrid Columns

另外,我个人喜欢这里描述的方法 -使用 Freezable 继承父 DataContext或使用类继承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 ); 
        } 
    } 
}
于 2013-03-28T13:18:39.453 回答