绑定到父级DataContext中的依赖项属性

时间:2014-07-30 15:13:30

标签: c# wpf xaml binding datagrid

我想将第三列绑定到Window的DataContext中的CollectionBindingTwo属性,而不是CollectionBindingOne的项目的DataContext中。

通过在<DataGrid>内定义第二个集合,WPF假设本地范围或某事,并指向ItemsSource项目中的属性(CollectionBindingOne)。

<DataGrid DockPanel.Dock="Top" ItemsSource="{Binding CollectionBindingOne}" AutoGenerateColumns="False">
    <DataGridTextColumn Header="One" Binding="{Binding PropOne}"/>
    <DataGridTextColumn  Header="Two" Binding="{Binding PropTwo}"/>
    <DataGridComboBoxColumn Header="Three" ItemsSource="{Binding CollectionBindingTwo}"/>
</DataGrid>

例如,这可行,因为ComboBox不在<DataGrid>

<ComboBox IsEditable="True" ItemsSource="{Binding CollectionBindingTwo}"></ComboBox>

2 个答案:

答案 0 :(得分:3)

DataGridComboBoxColumn不是Visual Tree的一部分,因此通常的RelativeSource / ElementName绑定格式不起作用。您可以通过定义这些绑定格式将起作用的ElementStyle and EditingStyle来使用变通方法。另一个选择是使用我用于其他点的BindingProxy,并且在没有其他理由来定义ElementStyle / EditingStyle时将保存一些XAML。

这是继承自Freezable的BindingProxy类。

public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    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));
}

现在你的xaml看起来像这样:

<DataGrid DockPanel.Dock="Top"
          ItemsSource="{Binding CollectionBindingOne}"
          AutoGenerateColumns="False">
    <DataGrid.Resources>
        <helper:BindingProxy x:Key="proxy"
                             Data="{Binding }" />
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="One"
                            Binding="{Binding PropOne}" />
        <DataGridTextColumn Header="Two"
                            Binding="{Binding PropTwo}" />
        <DataGridComboBoxColumn Header="Three" 
                                ItemsSource="{Binding Data.CollectionBindingTwo,
                                              Source={StaticResource proxy}}" />
</DataGrid>

不要忘记在Window / UserControl的顶部声明帮助程序命名空间导入。

答案 1 :(得分:2)

这是[RelativeSource][1]绑定的用途。在这种情况下,您应该能够通过DataGrid的数据上下文来定位父数据上下文:

<DataGrid>
    <DataGridComboBoxColumn Header="Three" ItemsSource="{Binding  
        RelativeSource={RelativeSource AncestorType=DataGrid},
        Path=DataContext.CollectionBindingTwo}" />
</DataGrid>

ElementName绑定也应该有效:

<DataGrid x:Name="dataGrid">
    <DataGridComboBoxColumn Header="Three" 
        ItemsSource="{Binding ElementName=dataGrid, Path=DataContext.CollectionBindingTwo}" />
</DataGrid>