绑定到祖先的Datacontext

时间:2011-07-26 12:04:37

标签: c# wpf data-binding datagrid datacontext

最好先向我展示我的代码,然后提出问题:

<Window  DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<DataGrid ItemsSource="{Binding Printers}" >
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Drucker Typ" ItemsSource="{Binding Relative" SelectedItemBinding="{Binding PrinterType, Mode=TwoWay}"  Width="Auto" ItemsSource="{Binding}" />
</DataGrid.Columns>
</DataGrid>
</Window>

我有DataGridComboBoxColumn并希望将ItemsSource绑定到窗口的DataContext,将SelectedItem绑定到DataGrid的当前ItemsSource对象

如何做到这一点?

谢谢!

6 个答案:

答案 0 :(得分:4)

要避免使用您必须熟悉NameScope的ElementName,您还可以使用FindAncestor。在这里,您可以定义要绑定到的父对象的类型。

示例:

<TextBlock Text=”{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=Text}” />

答案 1 :(得分:2)

使用ElementName绑定表达式。这将允许您从绑定表达式中按名称引用窗口。

http://msdn.microsoft.com/en-us/library/system.windows.data.binding.elementname.aspx

这里解释了用法。

http://www.wpfdude.com/articles/BindingToElement.aspx

答案 2 :(得分:0)

<local:DataBaseSettings>
    <Grid>
        <DataGrid ItemsSource="{Binding Printers}">
            <DataGrid.Columns>
                <DataGridComboBoxColumn Header="Drucker Typ" 
                    ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:DataBaseSettings}}, Path=PrinterTypes}"
                    SelectedItem="{Binding PrinterType, Mode=TwoWay}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</local:DataBaseSettings>

请注意,如果每个Printer.PrinterType没有直接引用Window的DataContext中存在的项,则需要覆盖.Equals()类的PrinterType方法以使这两个项目相等

这样的东西
public override bool Equals(object obj)
{
    if (obj == null) return false;

    if (this.GetType() != obj.GetType()) return false;


    PrinterType printerType= (PrinterType)obj;

    return (this.Id == printerType.Id);
}

答案 3 :(得分:0)

现在我发现除了在运行时设置itemssource之外没有其他方法可以做到这一点:

private void SetComboBoxItemssource()
    {
        PrinterTypes = database.GetPrinterTypes();

        DataGridComboBoxColumn cmbColumn = null;

        foreach (DataGridColumn column in dtaPrinters.Columns)
        {
            if ((cmbColumn = column as DataGridComboBoxColumn) != null)
                break;
        }
        if (cmbColumn == null)
            return;

        cmbColumn.ItemsSource = PrinterTypes;
    }

虽然有效..

答案 4 :(得分:0)

我只能将此工作绑定到窗口的资源:

<DataGridComboboxColumn ItemsSource="{Binding Path=PrinterTypes, Source={StaticResource MyDataContext}}" ... />

我无法使用RelativeSources,FindAncestors等。

答案 5 :(得分:0)

以下对我有用。只是想发布它,因为我使用的答案被纳入了fix_likes_codes的答案的评论中。关键是在路径中的属性名称前面添加DataContext前缀。

<Button Command="{Binding Path=DataContext.SaveCommand, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}"
        CommandParameter="{Binding}">